Как я могу объявить массив переменных размеров (глобально)

Я хотел бы сделать три массива одинаковой длины. В соответствии с документацией , массивы должны быть определены как int myArray[10];, где 10 могут быть заменено на известную длину (другое целое число) или заполнено массивом {2, 3, 5, 6, 7}.

Однако, когда я попытался объявить значение int arrSize = 10;, а затем массив на основе этого размера int myArray[arrSize];, я получаю следующее : error: array bound is not an integer constant.

Есть ли способ изменить размеры массива, или мне просто нужно их жестко кодировать? (Меня учили hardcoding - это плохо и что-то избегать любой ценой.)

10 голосов | спросил user3.1415927 14 AM000000120000000831 2014, 00:23:08

4 ответа


17

В вашем вопросе есть 2 части.

1 /Как объявить постоянный размер массива вне массива?

Вы можете использовать макрос

#define ARRAY_SIZE 10
...
int myArray[ARRAY_SIZE];

или используйте константу

const int ARRAY_SIZE = 10;
...
int myArray[ARRAY_SIZE];

, если вы инициализировали массив и вам нужно знать его размер, вы можете сделать:

int myArray[] = {1, 2, 3, 4, 5};
const int ARRAY_SIZE = sizeof(myArray) / sizeof(int);

второй sizeof относится к типу каждого элемента вашего массива, здесь int.

2 /Как я могу получить массив, размер которого является динамическим (т. е. неизвестным до выполнения)?

Для этого вам понадобится динамическое распределение, которое работает на Arduino, но обычно не рекомендуется, так как это может привести к фрагментации «кучи».

Вы можете сделать (C путь):

// Declaration
int* myArray = 0;
int myArraySize = 0;

// Allocation (let's suppose size contains some value discovered at runtime,
// e.g. obtained from some external source)
if (myArray != 0) {
    myArray = (int*) realloc(myArray, size * sizeof(int));
} else {
    myArray = (int*) malloc(size * sizeof(int));
}

Или (способ C ++):

// Declaration
int* myArray = 0;
int myArraySize = 0;

// Allocation (let's suppose size contains some value discovered at runtime,
// e.g. obtained from some external source or through other program logic)
if (myArray != 0) {
    delete [] myArray;
}
myArray = new int [size];

Для получения дополнительной информации о проблемах с фрагментацией кучи вы можете обратиться к этот вопрос .

ответил jfpoilpret 14 AM000000120000003231 2014, 00:40:32
0

Размер массива должен быть известен во время компиляции. В противном случае вы должны распределять память динамически, используя:

char *chararray = malloc(sizeof(char)*x);

, где x (целое число) может быть задано в коде приложения (вы можете загрузить его из eeprom, если хотите, чтобы он был постоянным, но настраиваемым).


Однако, если вы просто хотите объявить некоторые массивы того же размера, вам просто нужно объявить число константу следующим образом:

const int arrsize = 10;
char array1[arrsize];
int array2[arrsize];

Я думаю, что не hardcoding вещи имеет смысл только в том случае, если вы разумно ожидаете, что пользователь захочет изменить настройку в какой-то момент. Я не знаю, так ли это.

ответил user2973 14 AM000000120000005231 2014, 00:37:52
0

Если вы знаете максимальную длину массива, просто инициализируйте массив этой длиной и используйте целое число, чтобы сообщить программе, сколько из этого массива использовать. Если это разница между 7,10 байт, вы не тратите столько на выделение памяти.

ответил MichaelT 30 Mayam18 2018, 01:16:35
-2

вы можете просто написать:

int myArray[] = {};

это создаст myArray динамического размера

ответил Pratik Katwate 30 Mayam18 2018, 01:03:24

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132