Я хотел бы сделать три массива одинаковой длины. Согласно документации , массивы должны быть определены как int myArray[10];
где 10 может быть заменено на известную длину (другое целое число) или заполнено массивом {2, 3, 5, 6, 7}
.
Однако, когда я попытался объявить значение , int arrSize = 10;
а затем массив , основанный на том , что размер int myArray[arrSize];
, я получаю следующее: error: array bound is not an integer constant
.
Есть ли способ по-разному определять размеры массивов, или мне просто нужно жестко их кодировать? (Меня учили жесткому программированию - это плохо и что-то, чего следует избегать любой ценой.)
programming
variables
code-optimization
user3.1415927
источник
источник
Ответы:
Ваш вопрос состоит из 2 частей на самом деле.
1 / Как я могу объявить постоянный размер массива вне массива?
Вы можете использовать макрос
или использовать константу
если вы инициализировали массив и вам нужно знать его размер, вы можете сделать:
второй
sizeof
тип каждого элемента вашего массива здесьint
.2 / Как получить массив динамического размера (т.е. неизвестного до времени выполнения)?
Для этого вам понадобится динамическое размещение, которое работает на Arduino, но, как правило, не рекомендуется, так как это может привести к фрагментации «кучи».
Вы можете сделать (C путь):
Или (путь C ++):
Подробнее о проблемах с фрагментацией кучи вы можете обратиться к этому вопросу .
источник
ARRAY_SIZE = sizeof myArray / sizeof myArray[0];
, таким образом вы можете изменить тип myArray без внесения ошибок. По той же причинеmyArray = realloc(myArray, size * sizeof *myArray);
. Кстати, приведение возвращаемого значенияmalloc()
илиrealloc()
также бесполезно. 2) ПроверкаmyArray != 0
в версии C бесполезна,realloc(NULL, sz)
равно как иmalloc(sz)
.Размер массива должен быть известен во время компиляции. В противном случае вы должны динамически распределять память, используя:
где x (целое число) может быть установлено в коде приложения (вы можете загрузить его из eeprom, если хотите, чтобы это был постоянный, но настраиваемый параметр).
Однако, если вы просто хотите объявить несколько массивов одинакового размера, вам просто нужно объявить число константой так:
Я думаю, что жесткое кодирование не имеет смысла, только если вы ожидаете, что пользователь захочет изменить настройку в какой-то момент. Я не знаю, так ли это.
источник
Если вы знаете максимальную длину массива, просто инициализируйте массив этой длины и используйте целое число, чтобы сообщить программе, какой объем этого массива использовать. Если это разница между 7,10 байтами, то вы не тратите столько памяти.
источник
Я знаю, что немного опоздал, но теоретически обычные массивы не могут быть созданы с использованием переменной, чтобы определить количество элементов, которые массив будет иметь, как в:
Это отобразит ошибку, так как при объявлении массива программа ожидает, что значение в скобках будет константой. Тем не менее, существует способ, с помощью которого можно создать массив с переменной, определяющей количество значений, которые будут иметь эти массивы, путем динамического выделения памяти для наборов значений (этот метод был протестирован только с одномерными массивами, не пытался пока многомерно), и получается что-то вроде этого:
После этого все, что осталось сделать, - это присвоить значение каждому элементу, созданному в экземпляре myArray (который уже является массивом), как это было бы для обычного массива, созданного как myArray [arrSize].
источник