The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"Инициализация статического массива переменной длинны"
Вариант для распечатки  
Пред. тема | След. тема 
Форум Программирование под UNIX (C/C++)
Изначальное сообщение [ Отслеживать ]

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

Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "Инициализация статического массива переменной длинны"  +/
Сообщение от ImPressed (ok) on 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 =).

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

2. "Инициализация статического массива переменной длинны"  +/
Сообщение от XAnder (ok) on 14-Июл-11, 08:58 
> но как указать что 'a' должен быть заполнен SIZE нулями?

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

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

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

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

3. "Инициализация статического массива переменной длинны"  –1 +/
Сообщение от ImPressed (ok) on 14-Июл-11, 09:03 

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

Вот так:

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

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

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

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

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

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

Ответить | Правка | ^ к родителю #3 | Наверх | Cообщить модератору

4. "Инициализация статического массива переменной длинны"  +/
Сообщение от Вова on 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};

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

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

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

Ответить | Правка | ^ к родителю #4 | Наверх | Cообщить модератору

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

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

Ответить | Правка | ^ к родителю #5 | Наверх | Cообщить модератору

8. "Инициализация статического массива переменной длинны"  +1 +/
Сообщение от Вова on 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};

Ответить | Правка | ^ к родителю #7 | Наверх | Cообщить модератору

10. "Инициализация статического массива переменной длинны"  +/
Сообщение от AHAHAC (ok) on 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

Ответить | Правка | ^ к родителю #7 | Наверх | Cообщить модератору

11. "Инициализация статического массива переменной длинны"  +/
Сообщение от Вова on 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

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

Ответить | Правка | ^ к родителю #10 | Наверх | Cообщить модератору

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

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

Ответить | Правка | ^ к родителю #4 | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру