Перевод числа в строку
- Войдите на сайт для отправки комментариев
Вс, 20/06/2021 - 14:46
Здравствуйте. Есть число 0,1,2,3...90.
Нужно это число разделить на 10 и перевести в строку или массив char, указав 1.целую часть, 2. точку, 3. десятичную часть. Поясню:
0 -> "0.0"
1 -> "0.1"
10 -> "1.0"
55 -> "5.5"
Ремарка. Изучив особенности форума, я понял, что, обращаясь на форум сначала нужно хоть как-то написать свой "г@внокод", а профи уже научат уму-разуму. Поэтому вот код, котелось бы услышать как его оптимизировать (ускорить, использовать меньше памяти и т.д., ведь для Arduino с небольшими ресурсами это важно)
int grouppresure = 12;// число, которое надо перевести в "1.2" String bar = String(grouppresure); // то же число в виде строки (без точки) char bars[3] = "0.0"; // здесь сохраним только точку, заменив числа. bars[0] = bar[bar.length()]; bars[2] = bar[bar.length()-1]; // теперь в переменной bars - значение "1.2"
Если относительно нормально делать, то dtostrf(), а если говнокодить - взять целую часть в строку, дробную часть в строку и всё это соединить через точку.
Здравствуйте. Есть число 0,1,2,3...90.
Нужно это число разделить на 10 и перевести в строку или массив char, указав 1.целую часть, 2. точку, 3. десятичную часть. Поясню:
0 -> "0.0"
1 -> "0.1"
55 -> "5.5"
доп вопросы:
1) числа ограничены 1-90, >0?
2) точка требуется для визуализации или расчетов далее?
к примеру, у меня температура хранится не во float, а в int t*100, я просто помню что нужно будет поделить на 100 для визуализации или нарисовать точку в нужном месте или откинуть 2 знака.
собственно вопрос, а в том ли месте вы пытаетесь сэкономить?
Спасибо. Полагаю, это как раз именно то, что мне нужно. К сожалению, с таким кодом программа компилируется, но некорректно работает, а что именно не так - не знаю, а параллельный порт занят, посмотреть не могу.
Но спасибо, что обратили внимание на эту функцию, я о ней не знал, теперь буду работать. И да, при использовании sprintf под скомпилированный проект отнимается 5% памяти устройства.
И да, при использовании sprintf под скомпилированный проект отнимается 5% памяти устройства.
а без sprintf скока было?
для чего нужна строчка. для вывода куда-то? Что мешает сделать вот так:
И, главное - неужели до этого нельзя было додуматься самому???
Здравствуйте. Есть число 0,1,2,3...90.
Нужно это число разделить на 10 и перевести в строку или массив char, указав 1.целую часть, 2. точку, 3. десятичную часть. Поясню:
0 -> "0.0"
1 -> "0.1"
55 -> "5.5"
доп вопросы:
1) числа ограничены 1-90, >0?
2) точка требуется для визуализации или расчетов далее?
к примеру, у меня температура хранится не во float, а в int t*100, я просто помню что нужно будет поделить на 100 для визуализации или нарисовать точку в нужном месте или откинуть 2 знака.
собственно вопрос, а в том ли месте вы пытаетесь сэкономить?
1. Да, числа ограничены именно 0->90. Максимальное значение, конечно, может достигать и 150, но это уже аварийная ситуация, программа в теории не должна допустить таких значений (хотя в жизни бывает всё, на практике было дело, когда у меня провод отвалился).
2. Да, точка именно для визуализации. В программе нет смысла хранить значения во float, а потом и вычисления с float производить.
3. У меня именно как у вас - давление в теории от 0 до 9 бар, датчик даёт показания с точностью до сотой, что мне совсем не нужно, достаточно десятых и хранения давления*10.
Пока сделал так
Но это, скорее, костыль. Программируя для Windows я б не заморачивался, т.к. памяти в компьютере, как и частоты процессора over500, с Arduino приходится изголяться, да ещё и нужные вычисления успевать проводить в цикле 10 мсек.
Пока сделал так
Но это, скорее, костыль.
для вашего уровня сойдет...
Пока сделал так
Но это, скорее, костыль.
для вашего уровня сойдет...
Есть желание уровень повышать. В скетче вообще хотел бы отказаться от использования String.
Есть желание уровень повышать.
Тогда больше пишите сами. Лучше не самое быстрое, но свое, чем чужой код. который завтра забыли.
А эффективность придет, если практиковаться будете
Да, числа ограничены именно 0->90.
я б еще так костыль сделал:
Ух. И не додумался бы, что 4+'0'='4', а это ж так элементарно.
Тогда
И без String получится. Только с char никогда не работал. Как их (вместе с точкой) быстро "конкатенировать" в массив из трёх символов? На ум приходит только явное указание bars[0]=... bars[1]=...
Тогда
И без String получится. Только с char никогда не работал. Как их (вместе с точкой) быстро "конкатенировать" в массив из трёх символов? На ум приходит только явное указание bars[0]=... bars[1]=...
Так пробуйте!
опять элементарщину спрашиваете?
Спасибо. Полагаю, это как раз именно то, что мне нужно. К сожалению, с таким кодом программа компилируется, но некорректно работает, а что именно не так - не знаю, а параллельный порт занят, посмотреть не могу.
Но спасибо, что обратили внимание на эту функцию, я о ней не знал, теперь буду работать. И да, при использовании sprintf под скомпилированный проект отнимается 5% памяти устройства.
Нормально там все работает, просто нужно чуть подкорректировать
sprintf(myStr,%d.%d;, pressure/10+'0',pressure%10+'0')
sprintf(myStr,%d.%d;, pressure/10+'0',pressure%10+'0')
Не портите строчку своего же кода, было правильно. а теперь бред написан
некорректно работает, а что именно не так - не знаю, а
Вы не выделяете ни одноuj байта памяти под массив myStr во второй строке. Он у Вас нулевой длины. А потом Вы нагло в этот массив пишете. Напишите там вместо [], например, [12] и будет много счастья :-)
1. Да, числа ограничены именно 0->90.
2. Да, точка именно для визуализации.
что то мне "кажется" что точку нужно добавлять в процедуре вывода т.к. она всегда будет в одной позиции без всяких вариантов.
не знаю куда вы выводите данные и почему задаете пустой массив... по мне так проще (в данном конкретном случае) использовать 2 локальные переменные под единицы и под десятые.
ИМХО пост по ловле вши на голове лысого человека...
1. Да, числа ограничены именно 0->90.
2. Да, точка именно для визуализации.
что то мне "кажется" что точку нужно добавлять в процедуре вывода т.к. она всегда будет в одной позиции без всяких вариантов.
не знаю куда вы выводите данные и почему задаете пустой массив... по мне так проще (в данном конкретном случае) использовать 2 локальные переменные под единицы и под десятые.
ИМХО пост по ловле вши на голове лысого человека...
Вопрос уже решён выводом 1/10, точки и остатка от деления на 10. Именно в процедуре вывода это и происходит. Вывод идёт в Serial порт.