Добрый день! Избавляюсь в коде от 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
С чего? Ну, смотри. Вот ты присвоил str_p[0] единицу и через строчку выел её. Потом ты присвоил str_p[1] девятку и через строчку выел её. Пока всё печатается правильно, а ты чего ждал? Затем ты запихал в строку str_format "0.". А после этого, ты сделал какую-то невнятную хрень и, плюя на все предупреждения компилятора сидишь и плачешься о чём-то. Второй параметр strcat - строка, а ты туда символы пихаешь. Увеличь длину str_p до 3, запихай во вторую позицию '\0' и один раз при strcat'ь её к твоему "0." и будет счастье. А на компилятор не плюй. Если предупреждает - значит по делу, он твой друг, а не муха. чтобы отмахиваться.
а чем 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
в данном случае дело исключительно в весе. Всем огромное спасибо. Код (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); .. работает)
можно еще немного сэкономить если вот так например Код (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;
сыканомить, это когда вот так Код (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]='.';
Подскажите, есть счетчик Код (C++): long count_prev; его в любом случае разбивать на массив символов или можно как-то целиком к str_format прицепить?
тока sprintf тащит за собой vfprintf на 1.5 килобайта и без спицальных телодвижений float не печатает. C dtostrf ситуация палегше.