2013-04-29 1 views
2

У меня есть массив, который используется в коммуникационном протоколе (дескриптор устройства USB). Этот протокол вызывает размер массива в заголовке массива. Так что я хотел бы сделать это (что запрещено):как разместить размер массива внутри самого инициализатора массива в C?

static uint8_t array[]= { 
    TYPE, 
    sizeof(array), 
    other data... 
}; 

Массив, находясь в только для чтения части памяти, я не могу переопределить соответствующую ячейку после факта, и я не очень желая скопировать его, чтобы переопределить ячейку (она находится в минимальной встроенной системе). Мне нужно, чтобы он выглядел как «на проводе», потому что он пройдет через DMA.

Есть ли какая-то магия, которая могла бы обойти это ограничение? Я готов использовать расширения C99 или GNU. Я не буду переключаться только на это, но мне также интересно, как на C++-решение.

+1

и указать размер массива в объявлении, например, поскольку 'static uint8_t array [18] = ...', по-видимому, не является более полезным решением, чем «почему бы вам просто не набирать размер массива вручную, а не использовать sizeof»? – Tommy

+0

«Массив, находящийся в части памяти только для чтения» Этого не может быть, если вы не опустили 'const'. –

+0

@ danielFischer хороший улов, спасибо. Но с или без «const» этот материал заканчивается в заблокированной части карты памяти. – nraynaud

ответ

3

Если вы не будете использовать массив, но на структуру, которую он выглядит, как вы действительно хотите, то можно было бы:

typedef struct 
{  int  type, size, other; 
} pack_t; 
static pack_t a = 
{  10, sizeof(a), 11 
}; 
+0

отличная идея, спасибо. – nraynaud

+0

вот результат: https://gist.github.com/nraynaud/5484759 Я занимаюсь подсчетом строк, вы видите более компактный способ сделать это? Слишком плохо, что я не могу использовать '=' непосредственно в структуре. – nraynaud

+2

Конечно, вы можете потерять имена полей, но это не помогает читаемости. Если вам нужно сделать многие из этих дескрипторов, я бы сделал макрос, заполняющий большинство стандартных значений, и принимая переменные из параметров макроса. –

 Смежные вопросы

  • Нет связанных вопросов^_^