Вот то, что я сделал:
Это дурачит Visual Studio в размышление, что Вы добавили таблицу стилей к странице, но это не становится представленным.
Вот еще более краткий способ сделать это с несколькими ссылками;
<% if (false) { %>
<% } %>
, Как замечено в это сообщение в блоге от Phil Haack.
Вы уверены, что компилируете тот же код, который разместили здесь?
Если ваш компилятор жалуется в этой строке
p_data = &p_struct->DATA;
с сообщением «Ожидается член структуры / объединения», значит, ваш компилятор наверное сломан.
Обратите внимание, что & p_struct-> DATA
является вполне допустимым выражением в C. Нет абсолютно никаких проблем с самим этим выражением.
Проблема в том, что это не то, что вам нужно в вашем случае. & p_struct-> DATA
возвращает указатель на весь массив «DATA», то есть указатель типа unsigned char (*) [20]
. Вы пытаетесь присвоить это значение указателю типа unsigned char *
. Это недопустимо в C, поскольку типы совершенно разные, но традиционно компиляторы C ответили на это простым " На самом деле нет причин даже создавать указатель, который вы пытаетесь создать. Код будет отлично работать без какого-либо дополнительного указателя, просто откройте поле DATA
напрямую
theCount = 0;
while (p_struct->DATA[theCount] != 0) {
p_struct->DATA[theCount++] = 0;
(я бы, вероятно, использовал здесь для цикла
).
Если вы действительно настаивайте на создании этого указателя и продолжайте использовать индексный доступ, код должен выглядеть примерно так (другие уже предлагали это более одного раза)
p_data = p_struct->DATA; /* or &p_struct->DATA[0] */
...
theCount = 0;
while (p_data[theCount] != 0) {
p_data[theCount++] = 0;
Более того, вы можете выбрать более "экзотический" вариант:)
unsigned char (*p_data)[20]; /* <- note: declared differently */
...
p_data = &p_struct->DATA; /* <- note: your original version */
...
theCount = 0;
while ((*p_data)[theCount] != 0) {
(*p_data)[theCount++] = 0;
Однако, возвращаясь к версии unsigned char * p_data
, поскольку вы создаете этот указатель, может иметь смысл использовать технику «скользящего указателя» вместо использования доступа по индексу
unsigned char *p_data;
...
p_data = p_struct->DATA; /* or &p_struct->DATA[0] */
...
while (*p_data != 0) {
*p_data++ = 0;
Как всегда, это все дело личных предпочтений. Конечно,
Вы должны написать одно из двух:
p_data = p_struct->DATA; // DATA is the address of the first element.
ИЛИ
p_data = &p_struct->DATA[0]; // taking the address of the first element.
Нет & в
p_data = & p_struct-> DATA;
p_struct уже является указателем. После этого используйте p_data [] для доступа к вашему массиву.
Просто удалите & в начале, например:
p_data = p_struct->DATA;
Это специальный синтаксис для массивов (помните, что они всегда передаются как ссылка), и он эквивалентен:
p_data = &p_struct->DATA[0];
И да , теперь вы можете использовать * (pdata + 3)
Надеюсь, это поможет.
Ой! Спасибо AndreyT
struct DEV_STATUS * p_struct;
беззнаковый символ * p_data;
p_struct = & g_cmdQueue [queIdx];
p_data = & p_struct-> DATA;
p_struct
- это указатель на struct DEV_STATUS
.
& p_struct
- адрес указателя на struct DEV_STATUS
( или указатель на указатель на структуру struct DEV_STATUS
).
Вы, вероятно, захотите изменить эту строку на
p_data = p_struct->DATA;
О ... ваша функция clean_buffers ()
не выполняет " очистить "элемент g_cmdQueue [59]
.
И, поскольку это глобальный объект, массив g_cmdQueue
инициализируется всеми нулями даже до первого оператора main ()
исключения.