Динамический массив структур

sirik
Offline
Зарегистрирован: 10.11.2012

Добрый день

Есть некая структура:

struct _User	{
	  String Name;	
	  float L;
	};

Создать статический массив из структуры без проблем, а вот как сделать динамический?

На уме только всевдодинамический массив: инициализировать массив, скажем на 30 элементов, а по мере добавления держать флаг-размер реального массива. Но не знаю или это кошерно и что делать если количество "реальных" элементов станет больше тех же 30?

nick_shl
Offline
Зарегистрирован: 25.03.2014

new() или malloc() + структуры ссылающиеся на себя организованные в связанный список. Вот только что делать, когда память закончится? :D

Не забываем delete() или free() для выкидывния из памяти структур, которые больше не нужны.

vlkam
Offline
Зарегистрирован: 17.02.2013

 А вот вопрос имею - насколько вообще применимы такие приемы, как динамический массив в Ардуино ?

Ведь при динамическом выделении/освобождении память фрагментируется. Не возникнет ли от этого проблемы при эксплуатации 24/365 ?

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

Я вообще не могу представить задачу для ардуино, где требуется именно динамическое использование структур. Везде хватает грамотно продуманной логики поведения и статического использования.

vlkam
Offline
Зарегистрирован: 17.02.2013

Tomasina пишет:
Я вообще не могу представить задачу для ардуино, где требуется именно динамическое использование структур. Везде хватает грамотно продуманной логики поведения и статического использования.

Как Вы со статической логикой обработаете,например, последовательно происходящие события, длительность обработки которых может быть больше, чем период между их возникновением.
А если при этом длительность событий еще и разная? Например более позднее событие может закончится раньше

Проблема в том, что эти события нужно накапливать где то. Либо статический массив максимального размера, который сожрет кучу памяти, либо динамическое выделение по необходимости

Например у меня есть система, принимающая радиокоманды. Радиокоманды принимаются прерываниями, прием длится микросекунды, а обработка их длится минутами. Их желательно накапливать. Но динамическое выделение делать боюсь, т.к. система работает 24/365. Сейчас потерянные команды просто игнорируются

Так что "не могу представить" это только от недостатка опыта

sadovod
Offline
Зарегистрирован: 09.10.2015

Добрый день!Подскажите пожалуйста как объявить динамический массив так,чтобы потом в зависимости от условий которые определяются в списке if делать разные присвоения массиву?Вот фрагмент кода:

int solod_time[]={};
int solod_temp[]={};
int minuta=0;

void loop()
{
if (m==1){

         int solod_time[]={240,270,300,330,360,390,420,450,480,510,540,570,600,960,990,1020,1050,1080,1200,1230,1260,1440}; 
         int solod_temp[]={25,27,29,31,33,35,37,39,41,43,45,47,50,50,55,60,65,70,70,78,85,85};
}

else if (m==2){

int solod_time[]={210}; 

         int solod_temp[]={30};
}
  if ((m==1 and p2==1) or (m==2 and p2==1)) {
for (int i = 0; i < (sizeof(solod_time)/sizeof(int)) - 1; i++) {
Serial.println(i+" "+solod_time[i]);
if (minuta<=solod_time[i]) {
Serial.print(" i= ");
Serial.print(i);
Serial.print(" solod_temp=");
Serial.println(solod_temp[i]);  
}
}
  }

 

 

sadovod
Offline
Зарегистрирован: 09.10.2015

непонятно почему если вывести массив в условии if он считается правильно,но когда доходит до цикла значения показываются с потолка

Radjah
Offline
Зарегистрирован: 06.08.2014

1-2 - объявил массив глобально

7-18 - объявил и заполнил массив локально

И почему там мусор? Ну хрен его знает.

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

перефразирую иронию: у тебя массив в строке 9 и массив в строке 17 - это РАЗНЫЕ массивы с одинаковыми именами.

sadovod
Offline
Зарегистрирован: 09.10.2015

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

sadovod
Offline
Зарегистрирован: 09.10.2015

уже два дня голову ломаю.Если удрать объявление глобальное,то компилятор ругается в цикле for,а в условии if как-будто массив не видет.Есть способ сделать правильно?

Radjah
Offline
Зарегистрирован: 06.08.2014

9-10, 15-16 - убрать int

А вообще я бы сделал вынес вот это всё в 1-2 и до кучи в PROGMEM, чтобы константами память не занимать.

sadovod
Offline
Зарегистрирован: 09.10.2015

так если убрать int как же тогда присвоить массивам значения?

Radjah
Offline
Зарегистрирован: 06.08.2014

int имя = значение - это объявление с инициализацией

имя = значение - это присвоение.

Ты делаешь первое.  У тебя появляется еще один локальный массив с тем же именем, который уничтожается при выходе из функции.

Если уберешь int, то будут заполенены уже объявленные глобальные массивы.

sadovod
Offline
Зарегистрирован: 09.10.2015

Спасибо,это я уже понял,что создаю другой массив объявляя ее через int. Но теперь запара как заполнить объявленный ранее динамический массив

int solod_time[]={}; //объявили массив

void setup() {

}

void loop() {
solod_time []={240,270,300,330};//так выдает ошибу
}

 

Radjah
Offline
Зарегистрирован: 06.08.2014

int solod_time[]={240,270,300,330};

Зачем его заполнять, когда можно сразу объявить заполненным?

Делаешь 4 массива и используешь их в зависимости от флага.

sadovod
Offline
Зарегистрирован: 09.10.2015

дело в том,что заполнение должно происходить от условий выбора.Например выбрал 1 пункт меню-массив заполнился одними даными,выбрал 2-другими.Если так делать нельзя,тогда буду искать другие пути.Спасибо за помощь

Radjah
Offline
Зарегистрирован: 06.08.2014

Читай сообщение полностью, а не через строку.