Преобразовать строку в массив

Тема в разделе "Arduino & Shields", создана пользователем Hollligan, 15 фев 2016.

Метки:
  1. Hollligan

    Hollligan Нерд

    Добрый день!
    Я использую плату 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};

    Пробовал найти какой нибудь готовы пример кода но так и не получилось.
    Буду благодарен за помощь.
     
  2. Onkel

    Onkel Гуру

    sscanf()
     
  3. Hollligan

    Hollligan Нерд

    А как быть если заранее не известно количество элементов массива?
    Если я правильно понимаю для функции sscanf() нужно заранее объявить переменные в которые будет помещен результат парсинга, например вот так - sscanf(buffer,":%i,%i",&temp,&timer);
     
  4. Onkel

    Onkel Гуру

    ну если к-во чисел ограничено, то ничего не мешает их и объявить, а потом учесть что sscanf() возвращает число считанных данных.
     
  5. Hollligan

    Hollligan Нерд

    Вот реальный пример массива:
    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 переменных.

    мб есть еще какой то способ?
     
  6. Onkel

    Onkel Гуру

    так вам в любом случае придется заводить столько переменных, сколько будет элементов в строке. Массив ведь тоже переменнные.
    Других способов множество, но если вы не собираетесь применять функции резервирования памяти, а заранее выделите память под массив, то sscaf() будет и простейшим, и самым быстрым. Кто вам мешает сгенерить,например, в экзеле строку sscanf(sscanf(buffer,":%i,%i",buf,buf+1.....); хоть со 179 членами.
    Можно, конечно, отрезать от buffer строки до разделителя и потом их sscanf() считывать, а можно и в циклах тупо считывать побайтно и обрабатывать.
     
  7. Joy

    Joy Нерд

    Код (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);
     
    Hollligan нравится это.
  8. Onkel

    Onkel Гуру

    не покатит. В объявлении массива должно стоять число, а не переменная (у вас с). У ардуины свои фукции резервирования памяти.
    Или в ардуине такие фокусы с памятью прокатывают?
     
    Последнее редактирование: 15 фев 2016
  9. Joy

    Joy Нерд

    проверено на uno. все работает как надо.
     
  10. Максим B

    Максим B Гуру

    Просто поинтересуюсь - почему нельзя допустим не полностью хранить массив, а например прилетела вам последовательность "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" ?

    Если будут известны все коды пульта - тогда можно не считывать полностью огромный массив. Я не прав?
     
  11. Hollligan

    Hollligan Нерд

    Ограничение памяти.
    Использую leonardo+ethernet shield. В качестве библиотекеrи подключаю aREST.
    Свободная память 1% :)
     
  12. Hollligan

    Hollligan Нерд

    спасибо, работает!
     
  13. Kopilov

    Kopilov Гик

    Так, к слову.
    А JSON кто-нибудь на Arduino пробовал?
     
  14. Hollligan

    Hollligan Нерд

    Да, использую arduino в качестве REST сервера.
    https://github.com/marcoschwartz/aREST/
     
    Kopilov нравится это.
  15. AlexVS

    AlexVS Гик

    Тоже использую, прогноз погоды получаю в JSON.
     
  16. Hollligan

    Hollligan Нерд

    Можно пример скэтча?
     
  17. AlexVS

    AlexVS Гик

    Kopilov, rico и Hollligan нравится это.
  18. Hollligan

    Hollligan Нерд

    Нет, спасибо. Это то что нужно.