2016-11-24 3 views
0

мне нужно инициализировать исправления размера массивов довольно часто, например, так:Умный способ инициализации массива?

for(uint16_t q=0; q<SIZE; q++) 
    array[q]=value; 

массива определяется как float array[SIZE];

Есть ли лучше способ сделать это, заменяя макрос или подобное?

p.s. Не разрешено использовать mem___ звонки.

+3

Что лучше, чем это и без 'memset' или' memcpy'? Какой тип 'array'? – i486

+4

Является ли это 'значение' известным во время компиляции или вы получаете время выполнения? – Swanand

+5

Пожалуйста, определите «лучше». –

ответ

0

С препроцессора вы можете сделать так:

#define nmembers(x) (sizeof(x)/sizeof(*(x))) 
#define arrset(arr, val) \ 
    do { \ 
     size_t i; \ 
     for (i = 0; i < nmembers(arr); ++i) \ 
      (arr)[i] = val; \ 
    } while (0) 

float array[SIZE], val = 0.67f; 
arrset(array, val); 
+0

Зачем вам писать такой уродливый макрос для такой простой вещи? Просто напишите равнину для цикла, конец истории. Нет необходимости путать код с забвением. – Lundin

+0

Представьте себе дюжину этих петель. Это выглядит красивее: 'ИНИТАЛИЗИРОВАТЬ (myarr, SIZE, 0.0f),' вам не кажется. – Danijel

+0

@ Danijel Нет, это выглядит очень плохо. Программисты C понимают код C, они не понимают «мой частный, секретный макроязык». В C нет способа, который позволяет вам писать это более элегантно, чем 'for (size_t i = 0; i Lundin

0

C не имеет встроенного способа инициализации всего массива некоторым ненулевым значением.

Если вы используете GCC, он имеет расширение Designated Initializers. Вы можете использовать его как:

float widths[] = { [0 ... 99] = 3.14 }; 

Этот набор всех элементов 3.14.

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