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

leo_kg
Offline
Зарегистрирован: 20.05.2014

Здравствуйте форумчане.

Подскажите пожалуйста как в теле функции void setup обявить массив данных  который будет виден во всех функциях. В шапке программы не получается его обявить так как размер масива вычесляется в функции setap по количеству занятой памяти EEPROM.

Пробовал так: public key [i]; но компилятор руганулся на public.

Зарание спасибо.

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015
bwn
Offline
Зарегистрирован: 25.08.2014

Valera19701 пишет:

http://arduino.ru/Reference/Array

Увы, не прокатывает. С такой же проблемой на днях столкнулся.((((
Желает иметь только явные значения.

leo_kg
Offline
Зарегистрирован: 20.05.2014

Спасибо я это уже читал но к сожалению под мою задачу там подходящего нечего нету. 

Да я там в верху не правильно написал я пробовал public long key [i]; где i вычесленное занчение занятой памяти в EEPROM.

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

leo_kg пишет:

Здравствуйте форумчане.

Подскажите пожалуйста как в теле функции void setup обявить массив данных  который будет виден во всех функциях. В шапке программы не получается его обявить так как размер масива вычесляется в функции setap по количеству занятой памяти EEPROM.

Пробовал так: public key [i]; но компилятор руганулся на public.

Зарание спасибо.

Вы пишете весь код в одном файле *.ino или у вас есть другие файлы с исходным кодом, например, *.cpp и *.h? От этого зависит, каким образом объявить переменную, видимую всем и везде.

1. Если весь код в кучу, как любят тут на форуме - то достаточно сверху от setup() написать

long* key; // ваш массив из long

2. Если файлов с исходным кодом много, то надо в заголовочном файле принудительно экспортировать переменную, указав

extern long* key;

А в исходном - объявить её, как указано в пункте 1.

После этого, когда вы вычислили размер массива, вам надо сделать так:

key = new long[COUNT]; // COUNT - нужное кол-во элементов массива, это значение может содержаться в переменной.

И уже потом обращаться по индексу, например, так:

long firstEElementInArray = key[0];
long secondElementInArray = key[1];

key[0] = newValue;
key[1] = newValue2;

 

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Либо описать глобально массив с максимально нужной длиной, либо использовать malloc http://www.cplusplus.com/reference/cstdlib/malloc/ в setup после определения требуемой длины массива.

Нужно помнить, что объем памяти не безграничен. Не стоит злоупотреблять malloc/free.

Откуда взялся public, где Вы такое видели?

 

leo_kg
Offline
Зарегистрирован: 20.05.2014

kisoft пишет:

Откуда взялся public, где Вы такое видели?

Ну такое встречал в С++ и Java

DIYMan

Большое спасибо сейчас попробую как вы посоветовали.