Добрый день! Я использую плату leonardo. Для моего проекта мне необходимо выполнить преобразование строки: "4550,4350, 600,1600, 600,1600, 600,1600, 600,500". Цифры разделены "," но можно предусмотреть и другой разделитель. Количество групп цифр может варьироваться. В итоге мне необходимо получить массиву чисел - unsigned int rawData[67] = {4550,4350, 600,1600, 600,1600, 600,1600, 600,500}; Пробовал найти какой нибудь готовы пример кода но так и не получилось. Буду благодарен за помощь.
А как быть если заранее не известно количество элементов массива? Если я правильно понимаю для функции sscanf() нужно заранее объявить переменные в которые будет помещен результат парсинга, например вот так - sscanf(buffer,":%i,%i",&temp,&timer);
ну если к-во чисел ограничено, то ничего не мешает их и объявить, а потом учесть что sscanf() возвращает число считанных данных.
Вот реальный пример массива: unsigned int Mute[67] = {4550,4350, 600,1600, 600,1600, 600,1600, 600,500, 600,500, 550,500, 600,500, 600,500, 550,1650, 550,1650, 550,1650, 550,500, 600,500, 600,500, 550,500, 600,500, 600,1600, 600,1600, 600,1600, 600,1600, 600,500, 550,500, 600,500, 600,500, 550,500, 600,500, 600,500, 550,500, 600,1600, 600,1600, 600,1600, 600,1600, 600}; // SAMSUNG E0E0F00F Набор RawData для кондиционера будет уже unsigned int PowerOn[179] Не хотелось бы заводить 179 переменных. мб есть еще какой то способ?
так вам в любом случае придется заводить столько переменных, сколько будет элементов в строке. Массив ведь тоже переменнные. Других способов множество, но если вы не собираетесь применять функции резервирования памяти, а заранее выделите память под массив, то sscaf() будет и простейшим, и самым быстрым. Кто вам мешает сгенерить,например, в экзеле строку sscanf(sscanf(buffer,":%i,%i",buf,buf+1.....); хоть со 179 членами. Можно, конечно, отрезать от buffer строки до разделителя и потом их sscanf() считывать, а можно и в циклах тупо считывать побайтно и обрабатывать.
Код (C++): String s = "4550,4350,600,1600,600,1600,600,1600,600,500"; int i = 0, c = 0; do { c++; } while ((i = s.indexOf(',', ++i)) > 0); unsigned int rawData[c]; i = 0; c = 0; int ix = 0; String ts; do { ix = s.indexOf(',', i + 1); ts = s.substring(i, ix); rawData[c] = (unsigned int)ts.toInt(); c++; } while ((i = s.indexOf(',', ++i) + 1) > 0);
не покатит. В объявлении массива должно стоять число, а не переменная (у вас с). У ардуины свои фукции резервирования памяти. Или в ардуине такие фокусы с памятью прокатывают?
Просто поинтересуюсь - почему нельзя допустим не полностью хранить массив, а например прилетела вам последовательность "4550,4350,600,1600" - далее отправлять в кондиционер или куда-там готовую последовательность "4550,4350, 600,1600, 600,1600, 600,1600, 600,500, 600,500, 550,500, 600,500, 600,500, 550,1650, 550,1650, 550,1650, 550,500, 600,500, 600,500, 550,500, 600,500, 600,1600, 600,1600, 600,1600, 600,1600, 600,500, 550,500, 600,500, 600,500, 550,500, 600,500, 600,500, 550,500, 600,1600, 600,1600, 600,1600, 600,1600, 600" ? Если будут известны все коды пульта - тогда можно не считывать полностью огромный массив. Я не прав?
Ограничение памяти. Использую leonardo+ethernet shield. В качестве библиотекеrи подключаю aREST. Свободная память 1%
https://github.com/markert/ArduinoJsonParser тут библиотека и пример к ней. Или вам нужен именно пример разбра прогноза погоды?