Подскажите, пожалуйста, как инициализировать статический массив переменной длинны нулями. Если размерность массива, скажем, 2 то инициализация будет выглядеть как
double a[2]={0.,0.};
Теперь надо то же самое, но через переменную длинну массива. Скажем где-то в коде есть:
#define SIZE 2
и далее
double a[SIZE]=
но как указать что 'a' должен быть заполнен SIZE нулями?
P.S. На всякий случай, SIZE не переменная, а параметр, известный на момент копиляции.
Спасибо.
>[оверквотинг удален]
> double a[2]={0.,0.};
> Теперь надо то же самое, но через переменную длинну массива. Скажем где-то
> в коде есть:
> #define SIZE 2
> и далее
> double a[SIZE]=
> но как указать что 'a' должен быть заполнен SIZE нулями?
> P.S. На всякий случай, SIZE не переменная, а параметр, известный на момент
> копиляции.
> Спасибо.Во-первых. С чего вы взяли, что он переменной длины? Это обычный массив с размерностью 2 элемента типа double. При компиляции препроцессор языка C сделает из a[SIZE] a[2]. Инициализируется он также как и массив, размерность которого указана не через макрос, а цифрой, т.е double a[2]={0.,0.};
Если бы он был переменной длины, то он бы объявлялся как a[] или a[0]. И для него перед работой нужно было бы выделить память через malloc/calloc. Как вариант, можете использовать для 'зануления' массива memset или bzero =).
> но как указать что 'a' должен быть заполнен SIZE нулями?Простым способом — никак. Но можно поизвращаться с препроцессором, если SIZE изменяется в небольших пределах:
double a[SIZE] = {0,
#if SIZE > 1
0,
#if SIZE > 2
0,
...
#endif
#endif
};Однако гораздо проще заполнить его нулями циклом в начале выполнения программы.
> но как указать что 'a' должен быть заполнен SIZE нулями?
> P.S. На всякий случай, SIZE не переменная, а параметр, известный на момент
> копиляции.
> Спасибо.Вот так:
bzero(a,sizeof(double)*SIZE);
memset(a,0x00,sizeof(double)*SIZE);Ни каких извращений с препроцессором не надо.
Оно само заполнит нулями ровно sizeof(double)*SIZE байт
> bzero(a,sizeof(double)*SIZE);
> memset(a,0x00,sizeof(double)*SIZE);
> Ни каких извращений с препроцессором не надо.
> Оно само заполнит нулями ровно sizeof(double)*SIZE байтВсё верно. Вот только меня, как бывалого маразматика, заботит один вопрос:
Все мы знаем, что (double) 0.0 состоит только из нулевых байт. Но будет ли так всегда и на всех платформах?
>[оверквотинг удален]
> double a[2]={0.,0.};
> Теперь надо то же самое, но через переменную длинну массива. Скажем где-то
> в коде есть:
> #define SIZE 2
> и далее
> double a[SIZE]=
> но как указать что 'a' должен быть заполнен SIZE нулями?
> P.S. На всякий случай, SIZE не переменная, а параметр, известный на момент
> копиляции.
> Спасибо.#define SIZE 8
double a[SIZE] = {[0 ... SIZE - 1] = 3};
> #define SIZE 8
> double a[SIZE] = {[0 ... SIZE - 1] = 3};Ух ты, здорово! А это стандартная фишка или расширение gcc?
>> #define SIZE 8
>> double a[SIZE] = {[0 ... SIZE - 1] = 3};
> Ух ты, здорово! А это стандартная фишка или расширение gcc?Да, симпатичная вещь, да -гсс расширение, только для с, не для с++ -
http://gcc.gnu.org/onlinedocs/gcc/Designated-Inits.html
>>> #define SIZE 8
>>> double a[SIZE] = {[0 ... SIZE - 1] = 3};
>> Ух ты, здорово! А это стандартная фишка или расширение gcc?
> Да, симпатичная вещь, да -гсс расширение, только для с, не для с++
> -
> http://gcc.gnu.org/onlinedocs/gcc/Designated-Inits.htmlВообще с обнулением всё прощё - если хотя бы один элемент массива задан, то остальные обнуляются, то есть можно писать проще:
double a[SIZE] = {0.0};
>>> #define SIZE 8
>>> double a[SIZE] = {[0 ... SIZE - 1] = 3};
>> Ух ты, здорово! А это стандартная фишка или расширение gcc?
> Да, симпатичная вещь, да -гсс расширение, только для с, не для с++
> -
> http://gcc.gnu.org/onlinedocs/gcc/Designated-Inits.htmlНе гони, это фишка стандарта C99
>>>> #define SIZE 8
>>>> double a[SIZE] = {[0 ... SIZE - 1] = 3};
>>> Ух ты, здорово! А это стандартная фишка или расширение gcc?
>> Да, симпатичная вещь, да -гсс расширение, только для с, не для с++
>> -
>> http://gcc.gnu.org/onlinedocs/gcc/Designated-Inits.html
> Не гони, это фишка стандарта C99по ссылке надо читать не только первое предложение, но и читать далее.
> #define SIZE 8
> double a[SIZE] = {[0 ... SIZE - 1] = 3};Очень красиво! О чем-то таком я и спрашивал.
Спасибо!