URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 9188
[ Назад ]

Исходное сообщение
"Инициализация статического массива переменной длинны"

Отправлено ghost_in_machine , 14-Июл-11 02:45 
Подскажите, пожалуйста, как инициализировать статический массив переменной длинны нулями. Если размерность массива, скажем, 2 то инициализация будет выглядеть как
double a[2]={0.,0.};
Теперь надо то же самое, но через переменную длинну массива. Скажем где-то в коде есть:
#define SIZE 2
и далее
double a[SIZE]=
но как указать что 'a' должен быть заполнен SIZE нулями?
P.S. На всякий случай, SIZE не переменная, а параметр, известный на момент копиляции.
Спасибо.

Содержание

Сообщения в этом обсуждении
"Инициализация статического массива переменной длинны"
Отправлено ImPressed , 14-Июл-11 05:39 
>[оверквотинг удален]
> 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 =).


"Инициализация статического массива переменной длинны"
Отправлено XAnder , 14-Июл-11 08:58 
> но как указать что 'a' должен быть заполнен SIZE нулями?

Простым способом — никак. Но можно поизвращаться с препроцессором, если SIZE изменяется в небольших пределах:

double a[SIZE] = {0,
#if SIZE > 1
    0,
    #if SIZE > 2
        0,
        ...
    #endif
#endif
};

Однако гораздо проще заполнить его нулями циклом в начале выполнения программы.


"Инициализация статического массива переменной длинны"
Отправлено ImPressed , 14-Июл-11 09:03 

> но как указать что 'a' должен быть заполнен SIZE нулями?
> P.S. На всякий случай, SIZE не переменная, а параметр, известный на момент
> копиляции.
> Спасибо.

Вот так:

bzero(a,sizeof(double)*SIZE);
memset(a,0x00,sizeof(double)*SIZE);

Ни каких извращений с препроцессором не надо.
Оно само заполнит нулями ровно sizeof(double)*SIZE байт


"Инициализация статического массива переменной длинны"
Отправлено XAnder , 14-Июл-11 13:37 
> bzero(a,sizeof(double)*SIZE);
> memset(a,0x00,sizeof(double)*SIZE);
> Ни каких извращений с препроцессором не надо.
> Оно само заполнит нулями ровно sizeof(double)*SIZE байт

Всё верно. Вот только меня, как бывалого маразматика, заботит один вопрос:

Все мы знаем, что (double) 0.0 состоит только из нулевых байт. Но будет ли так всегда и на всех платформах?


"Инициализация статического массива переменной длинны"
Отправлено Вова , 14-Июл-11 11:23 
>[оверквотинг удален]
> 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};


"Инициализация статического массива переменной длинны"
Отправлено XAnder , 14-Июл-11 13:27 
> #define SIZE 8
> double a[SIZE] = {[0 ... SIZE - 1] = 3};

Ух ты, здорово! А это стандартная фишка или расширение gcc?


"Инициализация статического массива переменной длинны"
Отправлено Вова , 14-Июл-11 15:42 
>> #define SIZE 8
>> double a[SIZE] = {[0 ... SIZE - 1] = 3};
> Ух ты, здорово! А это стандартная фишка или расширение gcc?

Да, симпатичная вещь, да -гсс расширение, только для с, не для с++ -
http://gcc.gnu.org/onlinedocs/gcc/Designated-Inits.html


"Инициализация статического массива переменной длинны"
Отправлено Вова , 14-Июл-11 15:46 
>>> #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};


"Инициализация статического массива переменной длинны"
Отправлено AHAHAC , 23-Июл-11 23:00 
>>> #define SIZE 8
>>> double a[SIZE] = {[0 ... SIZE - 1] = 3};
>> Ух ты, здорово! А это стандартная фишка или расширение gcc?
> Да, симпатичная вещь, да -гсс расширение, только для с, не для с++
> -
> http://gcc.gnu.org/onlinedocs/gcc/Designated-Inits.html

Не гони, это фишка стандарта C99


"Инициализация статического массива переменной длинны"
Отправлено Вова , 02-Авг-11 08:58 
>>>> #define SIZE 8
>>>> double a[SIZE] = {[0 ... SIZE - 1] = 3};
>>> Ух ты, здорово! А это стандартная фишка или расширение gcc?
>> Да, симпатичная вещь, да -гсс расширение, только для с, не для с++
>> -
>> http://gcc.gnu.org/onlinedocs/gcc/Designated-Inits.html
> Не гони, это фишка стандарта C99

по ссылке надо читать не только первое предложение, но и читать далее.


"Инициализация статического массива переменной длинны"
Отправлено ghost_in_machine , 22-Июл-11 22:10 
> #define SIZE 8
> double a[SIZE] = {[0 ... SIZE - 1] = 3};

Очень красиво! О чем-то таком я и спрашивал.
Спасибо!