Инициализируйте все элементы в массиве значением, используя составные литералы - PullRequest
8 голосов
/ 25 октября 2011
float myArray[myArraySize] = {1};

В приведенном выше выражении только первый элемент является init с 1. Как вы можете инициализировать все элементы значением, используя составные литералы (не memset)?

Я использую GCC 4.2 на Unix для компиляции.

Ответы [ 6 ]

6 голосов
/ 25 октября 2011

Это

float myArray[100] = {[0 ... 99] = 1.0};

как ты это делаешь.

См. Назначенные инициализаторы в документах GCC, где указано:

Чтобы инициализировать диапазон элементов одним и тем же значением, напишите `[first ... last] = value '.

5 голосов
/ 25 октября 2011

Нет, только первый элемент будет инициализирован до 1.0. Остальные будут инициализированы, но до 0,0 в соответствии со стандартом C. Взгляните на C faq , чтобы найти еще несколько примеров.

2 голосов
/ 26 октября 2011

Из языка стандарт :

6.7.8 Инициализация
...
10 Если объект, имеющий автоматическое время хранения, не являетсяинициализируется явно, его значение не определено.Если объект со статической продолжительностью хранения не инициализируется явно, то:
- если он имеет тип указателя, он инициализируется нулевым указателем;
- если он имеет арифметический тип, он инициализируется как (положительный илибез знака) ноль;
- если это агрегат, каждый элемент инициализируется (рекурсивно) в соответствии с этими правилами;
- если это объединение, первый именованный элемент инициализируется (рекурсивно) в соответствии с этими правилами.
...
21 Если в заключенном в скобки списке меньше инициализаторов, чем элементов или элементов совокупности, либо меньше символов в строковом литерале, используемом для инициализации массива известного размера, чем элементовв массиве остальная часть агрегата должна быть неявно инициализирована так же, как объекты, которые имеют статическую продолжительность хранения.

int arr[10]={1} и int arr[10]={0} дают точно такой же результат - элемент 0 инициализируется тем, что указано между фигурными скобками, а элементы с 1 по 9 инициализируются в 0 на основе параграфов 10и 21 выше.Только кажется отличным, потому что в одном случае явный инициализатор совпадает с неявным инициализатором.

0 голосов
/ 25 октября 2011

Инициализация любого массива в современных версиях C приведет к инициализации всех неопределенных записей в ноль.

Чтобы инициализировать все не указанные записи другим значением, вы можете попробовать memset; однако это очень хорошо работает только с массивами символов.

Для массивов без символов вы должны написать цикл.

0 голосов
/ 25 октября 2011

Как можно инициализировать все элементы значением, используя эту формулу (не memset)?

С помощью цикла.Вы не можете сделать это разумным и переносимым способом с memset.

float myArray[myArraySize] = {1};
for (size_t i=0; i<myArraySize; i++)
    myArray[i] = 1.;

Это может показаться уродливым, но это путь C (и он становится красивее, если вы переименуете myArraySize в нечто вродеN).В качестве альтернативы, если количество элементов является фиксированным, вы можете просто перечислить массив и, при желании, не указывать размер:

float myArray[] = {1., 1., 1., 1., 1., 1.};
0 голосов
/ 25 октября 2011

Нет, вам нужно сделать их все.Тем, кто не указан, присваивается значение по умолчанию, 0f для числа с плавающей запятой.

float myArray[4] = {1, 1, 1, 1};

Вы можете обнаружить, что простой цикл for приведет к наиболее поддерживаемому коду.Я, конечно, не рекомендовал бы использовать memset здесь.

...