• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе 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 будет не пустым музыка начнет играть.
 
Сверху Снизу