сложение Char

Тема в разделе "Arduino & Shields", создана пользователем save.l, 7 дек 2019.

  1. save.l

    save.l Гик

    Добрый день!
    Избавляюсь в коде от String и sprintf
    Помогите поправить код:
    Код (C++):
    char str_format[8];                           // переменная для вывода на lcd
    const byte offset = 48;                       // смещение ASCII
    byte dPrev = 19;

    void setup() {            
      Serial.begin(9600);
      char str_p[2];
      str_p[0] = char(offset + dPrev % 100 / 10);
      str_p[1] = char(offset + dPrev % 10);
      Serial.println(str_p[0]);
      Serial.println(str_p[1]);
      strcpy(str_format, "0.");
      strcat(str_format, str_p[0]);
      strcat(str_format, str_p[1]);
      Serial.println(str_format);
    }

    void loop() {
      // put your main code here, to run repeatedly:

    }
    выводит:
    Код (Text):

    1
    9
    0.⸮⸮⸮⸮
     
    а ожидаю в третьей строке 0.19
     
  2. Asper Daffy

    Asper Daffy Иксперд

    С чего?

    Ну, смотри. Вот ты присвоил str_p[0] единицу и через строчку выел её.
    Потом ты присвоил str_p[1] девятку и через строчку выел её.
    Пока всё печатается правильно, а ты чего ждал?

    Затем ты запихал в строку str_format "0.".
    А после этого, ты сделал какую-то невнятную хрень и, плюя на все предупреждения компилятора сидишь и плачешься о чём-то.

    Второй параметр strcat - строка, а ты туда символы пихаешь. Увеличь длину str_p до 3, запихай во вторую позицию '\0' и один раз при strcat'ь её к твоему "0." и будет счастье.

    А на компилятор не плюй. Если предупреждает - значит по делу, он твой друг, а не муха. чтобы отмахиваться.
     
    vvr, Andrey12 и save.l нравится это.
  3. akl

    akl Гуру

    а чем strcpy или strcat лучше sprintf-а?

    strcat тащемта орудует нуль-терминированными строками, так что надо делать хотя бы так:
    Код (C++):
     
        char str_p[3];
        str_p[0] = char(offset + dPrev % 100 / 10);
        str_p[1] = char(offset + dPrev % 10);
        str_p[2]=0;
        strcpy(str_format, "0.");
        strcat(str_format, str_p);
     
    только это ведь дико неудобно. неужели от этого какое-то сильное преимущество по сравнению со sprintf
     
    Последнее редактирование: 7 дек 2019
    Andrey12 и save.l нравится это.
  4. save.l

    save.l Гик

    в данном случае дело исключительно в весе.
    Всем огромное спасибо.
    Код (C++):
    ..
      char str_p[3];
      str_p[0] = char(offset + dPrev % 100 / 10);
      str_p[1] = char(offset + dPrev % 10);
      str_p[2] = '\0';
      strcpy(str_format, "0.");
      strcat(str_format, str_p);
      Serial.println(str_format);
    ..
    работает)
     
    Последнее редактирование: 8 дек 2019
  5. akl

    akl Гуру

    можно еще немного сэкономить если вот так например
    Код (C++):

        str_format[0]='0';
        str_format[1]='.';
        str_format[2]='0'+char(dPrev % 100 / 10);
        str_format[3]='0'+char(dPrev % 10);
        str_format[4]=0;
     
     
  6. Asper Daffy

    Asper Daffy Иксперд

    Andrey12 и DetSimen нравится это.
  7. DetSimen

    DetSimen Guest

    сыканомить, это когда вот так

    Код (C++):
    char *str_format = "0.00";

        str_format[2] += char(dPrev % 100 / 10);
        str_format[3] += char(dPrev % 10);
    тока в следущий вызов надо делать

    memset(str_format, '0',4); str_format[1]='.';
     
    Andrey12 и akl нравится это.
  8. save.l

    save.l Гик

    Позволяет. Но dtostrf ничуть не легче чем sprintf
     
  9. save.l

    save.l Гик

    Подскажите, есть счетчик
    Код (C++):
    long count_prev;
    его в любом случае разбивать на массив символов или можно как-то целиком к str_format прицепить?
     
  10. DetSimen

    DetSimen Guest

    тока sprintf тащит за собой vfprintf на 1.5 килобайта и без спицальных телодвижений float не печатает. C dtostrf ситуация палегше.
     
    Andrey12 нравится это.
  11. SergeiL

    SergeiL Оракул Модератор

    А нужен float?
    Чаще всего можно обойтись и целочисленной.
     
  12. DetSimen

    DetSimen Guest

    мне - нет. ТС городит вывод 0.19. :)
     
    Andrey12 и SergeiL нравится это.
  13. SergeiL

    SergeiL Оракул Модератор

    Sprintf много тянет, а itoa, ltoa - совсем мало.