• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Нужна помощь С++ массив указателей

Legantmar

New member
Есть в setup:
const char *text1 = "test1";
const char *text2 = "test2";
const char *text3 = "test3";
const char * texts[] = {text1, text2, text3};

Задача
Если есть файл, то "заменить" содержимое массива texts
положив в него прочитаные строки файла
Примерно так:
File file = SPIFFS.open("/newfile.txt", "r");
if (file) {
int i=0;
while(file.available()) {
String temp1 = file.readStringUntil('\n'); // читать строку до переноса строки включительно
String str = temp1.substring(0, temp1.length()-1); // отбрасываем перенос строки \n
char *chrstr = new char[str.length() + 1]; // создали массив по длине строки
strcpy(chrstr, str.c_str()); // преобразуем

texts[ i] = chrstr; // заменяем элементы
i++;

Проблема - строк может быть больше или меньше размерности определенной вначале (в этом примере = 3)
Следовательно нужно создать новый массив newarray сложить все в него,
удалить содержимое предыдущего как delete [] texts;
а затем сменить указатель texts = newarray;
но я не знаю как это сделать ((
кто знает, помогите.

p.s. вот тут есть пример, но у меня не получилось повторить для своих типов данных
 

Legantmar

New member
Сергей спасибо, что переписал скрипт с указателей на работу со строками, так стало понятнее,
но вопрос остался прежний.
есть String songs[] = {song1, song2, song3} (предустановленные мелодии)
по элементам которого далее создаются кнопки с именами и в некоторых частях кода есть функции типа play(songs)
Как мне выполнить подмену содержимого songs[] если я добавил файл с новыми мелодиями? т.е. нужно создать новый массив (newarray) с размерностью = количеству строк в текcтовом файле, удалить содержимое старого массива songs[] и заменить его указатель как songs = newarray. Я в этом не силен, но уверен, что со string это можно сделать проще, чем с указателями.
Задача сохранить название массива songs[], но корректно поменять его содержимое.

update: пока выкрутился через songs = newsong; в цикле и отдельной переменной количества новых элементов countSongs, чтобы далее перебирать только нужные элементы и не заходить на старые.
но ограничение - новых элементов (строк во внешнем файле) должно быть не более размерности songs иначе не влезают.
 
Последнее редактирование:

tretyakov_sa

Moderator
Команда форума
Как мне выполнить подмену содержимого songs[] если я добавил файл с новыми мелодиями?
Зачем тебе массив. Каждый раз когда нужна новая мелодия загружай ее с нового файла и проигрывай. В памяти всегда будет только одна мелодия все остальные в файле. Причем этот код:

Код:
 if (song!= "Failed" && song!= "Large"){   
  getMuzicPar();
   while (song != "")
{
  playNote();
  }  
  }
  else Serial.println("Bad File");
можно перенести в loop, а чтение строки можно делать в любом месте программы. Как только song будет не пустым музыка начнет играть.
 
Сверху Снизу