Bodr 0 5 октября, 2023 Опубликовано 5 октября, 2023 · Жалоба Здравствуйте, Простейшая задача в ArduinoIDE2 - нужно загрузить значения переменных из конфиг файла расположенного на SD карте вида: WiFissid=MegaNet WiFipass=100500 ScreenRefreshRate=10 AutoSleepMode=1000 (и так до 30-50 переменных). Все переменные объявлены в начале скетча в ArduinoIDE2. То-есть нужно прочитать каждую запись в конфиг файле и назначить значения соответствующим переменным. Самое логически верное решение в развитых языка программирования было бы: for ( int i = 1; while configFile line i exist ; 1) { var_name = read text before symbol "=" from configFile line i; var(var_name) = read text after symbol "=" from configFile line i; } Пока в ArduinoIDE2 продвинуться дальше данного кода не могу: File FileConfig = SD.open("/config.cfg", FILE_READ); while(FileConfig.available()) { String Config_Setting = FileConfig.readStringUntil('\n'); var(Config_Setting.substring(0,'=')) = Config_Setting.substring('='+1); } Тк 4-я строка в ArduinoIDE2 не пашет тк не понимает "var()" и не ясно как переходить на следующую строку из файла 2,3,4,5... Как это реализовать в ArduinoIDE2 посимпатичнее без жутких циклов с перебором по 1 char итп монструозных нагромождений? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_pv 69 6 октября, 2023 Опубликовано 6 октября, 2023 · Жалоба ждите когда с++23 завезут рефлексию 🙂 мало ведь пока ещё там всякого RTTI говна в эмбед с десктопа притащено... а пока массив нужен для соответствия названий и указателей на переменные, #define X(var) {#var,&var} ну а чтобы не перебирать всё подряд через strcmp считайте хэш. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Bodr 0 6 октября, 2023 Опубликовано 6 октября, 2023 · Жалоба 58 минут назад, _pv сказал: а пока массив нужен для соответствия названий и указателей на переменные, #define X(var) {#var,&var} ну а чтобы не перебирать всё подряд через strcmp считайте хэш. Наверно без толку, если всё равно назначать придётся по-1 переменной построчно точно указывая каждую переменную? 😕 Или переменные в массиве доступны всей прошивке как одиночные и могут быть назначены 1 переборов файла конфига? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
x893 51 6 октября, 2023 Опубликовано 6 октября, 2023 · Жалоба 22 hours ago, Bodr said: var(var_name) = У меня более простой вопрос - какой язык программирования имелся ввиду ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Bodr 0 6 октября, 2023 Опубликовано 6 октября, 2023 (изменено) · Жалоба 4 часа назад, x893 сказал: У меня более простой вопрос - какой язык программирования имелся ввиду ? Те, которые могут всё - логика и Asm. Изменено 6 октября, 2023 пользователем Bodr Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
x893 51 6 октября, 2023 Опубликовано 6 октября, 2023 · Жалоба Без знаний - это путь в ад. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Bodr 0 7 октября, 2023 Опубликовано 7 октября, 2023 (изменено) · Жалоба 11 часов назад, x893 сказал: Без знаний - это путь в ад. В такой формулировке важно уточнять - "без знаний долбанных ограничений и недоделок конкретной среды". 😉 Ладно, уже флейм какой-то, что поделать, удобных вариантов нет, будем циклить и значение каждой переменной назначать вручную. Последние уточнения. Я так понимаю, что создавая объект файла в коде ArduinoIDE2 вида: File ConfigFile = SD.open(/tester.cfg, FILE_READ); Реального считывания данных не происходит. Тогда как в ArduinoIDE2 + SD.h лучше за раз быстро считать файл в память и потом перебирать его в памяти, а не запрашивая каждый раз SD-card?? Считать File в String или Stream? Вроде в Stream есть readString(). Или считывать 32битными блоками как двоичный код и потом его разбирать в памяти? Как это в данной среде правильнее, чтобы минимизировать нагрузку и кол-во обращений к SPI+SD? И если загрузить в массив - в массиве здесь курсор строки есть или тоже нет? Изменено 7 октября, 2023 пользователем Bodr Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
skripach 5 8 октября, 2023 Опубликовано 8 октября, 2023 · Жалоба Гуглить "ini parser". Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 231 8 октября, 2023 Опубликовано 8 октября, 2023 · Жалоба В 06.10.2023 в 23:14, x893 сказал: Без знаний - это путь в ад. Вы слишком многого хотите от поколения "акей гугл"-а. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 9 октября, 2023 Опубликовано 9 октября, 2023 · Жалоба как то работал с minIni. вполне ничё так. minIni.c minIni.h Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
turnon 1 9 октября, 2023 Опубликовано 9 октября, 2023 · Жалоба InlineIni.h Spoiler /* InlineIni ini; S<64> s("addr=0xFE; null=bit({stat},0); unit= °C"); char* key; char* value; ini.iterate(s, key, value); // true, key = "addr", value = "0xFE" ini.iterate(s, key, value); // true, key = "null", value = "bit({stat},0)" ini.iterate(s, key, value); // true, key = "unit", value = " °C" ini.iterate(s, key, value); // false */ class InlineIni { private: bool _started = false; bool _done = false; char* _nextKey = nullptr; public: bool started() const; void reset(); struct IterateOptions { bool allowOnlyKeys; char additionalDelimiter; }; bool iterate(char* buff, char* &key, char* &value, const IterateOptions &o = {}); }; InlineIni.cpp Spoiler #include "InlineIni.hpp" bool InlineIni::started() const { return _started; } void InlineIni::reset() { _started = false; _done = false; _nextKey = nullptr; } // [key1 = value1; key2 = value2; ,,,] bool InlineIni::iterate(char* buff, char* &key, char* &value, const IterateOptions &o) { if (!buff || _done) return false; key = nullptr; char* akey = nullptr; if (!_started) { akey = buff; _started = true; } else { if (_nextKey == nullptr) { _done = true; return false; } akey = _nextKey; } bool eqFound = false; char* s = akey; while (char &c = *s) { s++; switch (c) { case '=': if (!eqFound) { eqFound = true; c = '\0'; key = trim(akey, " "); value = s; } break; default: if (c != ';' && c != o.additionalDelimiter) continue; if (o.allowOnlyKeys && !eqFound) key = trim(akey, " "); c = '\0'; _nextKey = s; return !str::empty(key); } } if (o.allowOnlyKeys && *s == '\0') key = trim(akey, " "); _nextKey = nullptr; return !str::empty(key); } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
x893 51 9 октября, 2023 Опубликовано 9 октября, 2023 · Жалоба Зачем примеры ? Такое пишется за час с перекурами. Надо учится https://www.onlinegdb.com/ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться