Чтение конфига, затем работа с выбранными файлами

Eprinter
Offline
Зарегистрирован: 16.02.2018

Доброго дня.

Делаю один девайс, логика работы:

1. при включении считываем конфиг-файл с карты, пока так: num1=NAME1,03,05,14,22;num2=NAME2,.....

2. предусмотрено 8 разных пунктов меню (num1..8), в каждом своё имя (5 символов) и 4 двузначных (00..99) параметра, в девайсе есть 8 кнопок выбора одного из считанных вариантов (многократно, в процессе работы, в произвольном порядке)

3. в зависимости от выбранного варианта выводим на дисплей имя, параметры, и с этой же карты 3 изображения, имена которых: NAME1_.raw NAME1s.raw NAME1g.raw

4. соответственно числовые параметры (тоже свои для каждого варианта) используются в дальнейшей работе

Собственно вопрос в том, что не могу найти подходящий пример, где на основе считанных char[n] после происходило бы чтение файлов с этими именами.

Использую библиотеку UTFT, если заготовить все варианты заранее (#define name1 "NAME1", #define num1 "NAME1_.raw", ...), после компиляции всё работает, но при изменении вариантов придётся перепрошивать проц. Считать числа и засунуть их в массив проблем не вызывает. Изображения же пока получается формировать только через отдельные переменные (32 штуки - под каждое имя свою), и выводить через switch case, что достаточно громоздко. А можно ли создать и пользоваться массивом char, чтобы по номеру пункта меню сразу получать имена файлов? Так и не понял.

Не знаю, уместно ли упоминать, но String слишком прожорлив по сравнению с char array, в его сторону уже не смотрю, тормозит чрезмерно.

 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Я так и не понял, чего Вы хотите, но ответ в любом случае - можно.

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

Eprinter
Offline
Зарегистрирован: 16.02.2018

Может и не понял )) Вот к примеру здесь:

// объявляем массив строк
const char *names[]  = {
  "Period",   // 0
  "Work",     // 1
  "Stop",     // 2
};
// выводим третий элемент
Serial.println(names[2]); // выведет Stop

Но это константы, а как мне организовать подобную работу с загружаемыми значениями? Нигде не нашёл примера работы с двумерным массивом char[][], чтобы можно было работать как с отдельными символами (прописывать из конфиг-файла), так и с полученными словами (читать файлы).

Да, можно запихнуть все слова в одну строку типа "NAME1NAME2NAME3..." и при необходимости создавать переменную с "NAMEn_.raw", но может быть есть иной способ, чтобы по номеру нажатой кнопки взять созданный при старте char[n] и загрузить нужный файл?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Способов всегда много - самых разных. В том числе и разных способов решить одну и ту же задачу.

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

b707
Offline
Зарегистрирован: 26.05.2017

Eprinter пишет:

Может и не понял )) Вот к примеру здесь:

// объявляем массив строк
const char *names[]  = {
  "Period",   // 0
  "Work",     // 1
  "Stop",     // 2
};
// выводим третий элемент
Serial.println(names[2]); // выведет Stop

Но это константы, а как мне организовать подобную работу с загружаемыми значениями? Нигде не нашёл примера работы с двумерным массивом char[][], чтобы можно было работать как с отдельными символами (прописывать из конфиг-файла), так и с полученными словами (читать файлы).

да так же как с одинарными. Вы в одномерных разницу между const и просто массив понимаете? - так в чем же проблема?

 

Eprinter
Offline
Зарегистрирован: 16.02.2018

andriano пишет:

В принципе, можно порекомендовать отводить для каждого имени файла по 13 символов и хранить весь массив имен либо в общем массиве символов, либо в массиве массивов.

Хорошо, создал я массив char names[88] (имя+расширение=10 и нуль-терминатор, и так 8 раз). При старте забил его именами из конфига, например: VOLGA_.rawØKAMAZ_.rawØZAPAR_.rawØ....... А дальше как? Понадобилось мне загрузить  изображение, какой командой (или последовательностью команд) мне выцепить нужную подстроку, без манипуляций с побуквенным копированием в отдельную переменную char?

Пока вижу один путь (допустим выбран пункт меню i=2):

char name[11];
name[0] = names[i*11];
name[1] = names[i*11+1];
.....
name[6] = '_';
name[7] = '.';
.....
myFiles.load(0, 0, 480, 160, name); //выводим на экран файл "ZAPAR_.raw"

Вы примерно это имели в виду, или есть менее извращённый способ? ))

Я не программист по образованию, это часть моего хобби, пишу нужные мне программы довольно в лоб, используя в малопонятных местах найденные примеры, подгоняя их под себя в меру осознания. Делфи Паскаль для винды (полсотни программ), Си (десятки) и ассемблер (несколько) для МК - вроде бы опыт есть, но не глубокий. Если бы вы привели пример, или дали ссылку на почитать, я был бы более благодарен ))

ПС массив массивов погуглил, попадаются только примеры с числами, со строками не встретил...

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Камень какой?

b707
Offline
Зарегистрирован: 26.05.2017

Eprinter пишет:

Пока вижу один путь (допустим выбран пункт меню i=2):

char name[11];
name[0] = names[i*11];
name[1] = names[i*11+1];
.

Вы примерно это имели в виду, или есть менее извращённый способ? ))

Есть и не один...

а) про циклы что-нибудь слыхали ? зачем вручную копировать каждую из 11 букв. если можно запустить цикл For ?

б) если у вас в конце каждой строки стоит терминатор '\0' - то вообще ничего никуда не надо копировать. Фактически ваша строка из 100 символов  представляет 8 строк, записанных подряд.

Соответвенно указатель на строчку1 - это names. на строчку2 - это names+11 и так далее. Эти указатели можно использовать везде вместо самих строк. вообще ничего никуда не копируя

все гораздо проще:


char* name = names + i*11;
.....
myFiles.load(0, 0, 480, 160, name); //выводим на экран файл "ZAPAR_.raw"
Eprinter
Offline
Зарегистрирован: 16.02.2018

DetSimen пишет:

Камень какой?

мега2560

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Eprinter пишет:

DetSimen пишет:

Камень какой?

мега2560

дак чо ты паришься, используй String и не сы. 

Eprinter
Offline
Зарегистрирован: 16.02.2018

b707 пишет:

а) про циклы что-нибудь слыхали ? зачем вручную копировать каждую из 11 букв. если можно запустить цикл For ?

.....

все гораздо проще:


char* name = names + i*11;
.....
myFiles.load(0, 0, 480, 160, name); //выводим на экран файл "ZAPAR_.raw"

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

А вот за пример огромное спасибо! Теперь что-то проясняется ))

Eprinter
Offline
Зарегистрирован: 16.02.2018

DetSimen пишет:

дак чо ты паришься, используй String и не сы. 

Пробовал - тормозит. У меня вывод на экран идёт в loop, остальная работа - прерывания по таймеру (~20Гц). Пока все стринги не прибил, ловил глюки - то на экран кракозябры вылазят, то зависает. И это ещё не все обработчики написаны.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Eprinter пишет:
Пока все стринги не прибил, ловил глюки - то на экран кракозябры вылазят, то зависает.

Чесно сказать?  Это точно не из-за String. 

Eprinter
Offline
Зарегистрирован: 16.02.2018

DetSimen пишет:

Чесно сказать?  Это точно не из-за String. 

Ну да, тут дело в руках ))) но без стрингов перестало глючить. Да и везде предупреждают, что весьма ресурсоёмкая вестчь.

Eprinter
Offline
Зарегистрирован: 16.02.2018

b707 пишет:

все гораздо проще:


char* name = names + i*11;
.....
myFiles.load(0, 0, 480, 160, name); //выводим на экран файл "ZAPAR_.raw"

Ёлки, насколько всё просто работает!! И ведь везде похоже пишут, но не доходило, пока на живом, близком примере не увидел! Что-то вдруг в мозгу щёлкнуло и понял )))

Спасибо ещё много раз!!

Чтобы не оставить впечатление полного ламера, вот половинка моего девайса, стадия готовности не более 10% ))

Первый раз заморочился с графикой и флешкой, предыдущие поделки обходились 1602/2004/7сег, поэтому вопросов со строками никогда не возникало.