Инициализировать все элементы массива значением с помощью составных литералов
float myArray[myArraySize] = {1};
в выражении выше только первый элемент init с 1. Как вы можете инициализировать все элементы со значением, используя составные литералы (не memset)?
Я использую GCC 4.2 в unix для компиляции.
6 ответов
этой
float myArray[100] = {[0 ... 99] = 1.0};
Как вы делаете это.
посмотреть Назначенные Инициализаторы в документах GCC, в которых говорится:
чтобы инициализировать диапазон элементов с тем же значением, напишите `[first ... последние] = значение'.
нет, только первый элемент будет инициализирован до 1.0. Остальные будут инициализированы, но до 0,0 в стандарт C. Взгляните на C faq дополнительные примеры.
С языка стандартный:
инициализации 6.7.8
...
10 если объект с автоматической длительностью хранения не инициализирован явно, его значение не определено. Если объект со статической длительностью хранения не инициализируется явно, то:
- если он имеет тип указателя, он инициализируется нулевым указателем;
- если он имеет арифметический тип, он инициализируется (положительный или нет) ноль;
- если это является агрегатом, каждый член инициализируется (рекурсивно) в соответствии с этими правилами;
- если это объединение, первый именованный член инициализируется (рекурсивно) в соответствии с этими правила.
...
21 Если в списке, заключенном в скобки, меньше инициализаторов, чем элементов или членов или меньше символов в строковом литерале, используемом для инициализации массива известных размер чем элементы в массиве, остаток компосита будет инициализированный неявно то же самое, что и объекты со статической длительностью хранения.
int arr[10]={1}
и int arr[10]={0}
производства точно такой же результат - элемент 0 инициализируется тем, что указано между фигурными скобками, а элементы 1-9 инициализируются до 0 на основе пунктов 10 и 21 выше. Это только появляется отличаться, потому что в одном случае явный инициализатор совпадает с неявным инициализатором.
нет, вам нужно сделать их все. Тем, кто не указан, присваивается значение по умолчанию,0f
для поплавка.
float myArray[4] = {1, 1, 1, 1};
вы можете найти, что простой for
цикл приведет к наиболее поддерживаемому коду. Я, конечно, не буду поощрять использование memset
здесь.
как вы можете ввести все элементы со значением, используя эту формулу (не 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.};
инициализация любого массива в современных версиях C инициализирует все не указанные записи до нуля.
чтобы инициализировать все не указанные записи в другое значение, вы можете попробовать memset; однако это работает только очень хорошо на массивах символов.
для массивов без символов вы должны написать цикл.