String(5.3456,2) = ""???
- Войдите на сайт для отправки комментариев
Втр, 04/08/2015 - 16:18
Добрый день.
Вопрос собсетно в теме.
String() не преобразует double/float в строку. На выходе пустота.
В чем может быть проблема, как исправить?
Скетч можно приложить? Конкретный, который "не работает". Конструкторы String выглядят вполне рабочими. Хотя ни float, ни String стараюсь не использовать.
String::String(float value, unsigned char decimalPlaces) { init(); char buf[33]; *this = dtostrf(value, (decimalPlaces + 2), decimalPlaces, buf); } String::String(double value, unsigned char decimalPlaces) { init(); char buf[33]; *this = dtostrf(value, (decimalPlaces + 2), decimalPlaces, buf); }Не помню, как насчет String, а вот, например, sprintf и некоторые другие функции в версии 1.0.5 у меня не захотели обрабатывать float. А в 1.6.5 - без проблем. Экспериментировал, как попроще преобразовать float в строку с нужным мне форматированием. После чего сделал вывод, что в старых версиях с этим проблема.
После танцев с бубном, сделал вывод что функции нехватает свободной памяти. 277 байт мало, а вот при 314 уже работает.
И все-таки, какая у вас версия? Я экспериментировал на меге с отдельным скетчем, в котором, кроме самой функции, был только вывод в сериал результата. Не думаю, что меге да и не хватало памяти.
После танцев с бубном, сделал вывод что функции нехватает свободной памяти. 277 байт мало, а вот при 314 уже работает.
Это еще один из поводов не использовать плавающую арифметику и класс String, либо брать Ардуину типа меги2560.
А если очень нужно дробное значение. Использовать float = int * 100?
Если не использовать String, как же тогда вывести значение в char. Я понимаю можно передать float как два байта, но как их показать на том же дисплее?
И все-таки, какая у вас версия? Я экспериментировал на меге с отдельным скетчем, в котором, кроме самой функции, был только вывод в сериал результата. Не думаю, что меге да и не хватало памяти.
Версия 1.5.6r2
чип atmega328 NANO
Что интересно Serial.println(float, 2) работал нормально, что и несколько усложнило поиск проблемы.
А если очень нужно дробное значение. Использовать float = int * 100?
Если не использовать String, как же тогда вывести значение в char. Я понимаю можно передать float как два байта, но как их показать на том же дисплее?
Сравните:
void setup() { String s(3.14); Serial.print(s); } void loop() {}занимает 4504 байта (если моя IDE не врёт)
А программа, делающая тоже самое, но без String
void setup() { char s[6]; dtostrf(3.14, 5, 2, s); Serial.print(s); } void loop() {}занимает 3018 байтов! Т.е. в полтора раза меньше!
Вот и думайте, что использовать.
У String много полезных методов, но использовать его ради только преобразования ... это как если бы Вам нужно было программно Reset'нуть ардуину и Вы бы для этого стали поключать к ней сервопривод с нажимающим на кнопку "Reset" штифтом.
С дробными значениями - зависит от задачи, а со String - не столь важно сколько занимает скетч, сколько он будет жрать ОЗУ. Для преобразований проще выделить статический буфер, с ним и работать, нежели String будет выделять память динамически. Динамика - это куча проблем и иногда непредсказуемое поведение скетча.
В данном случае вы имете ввиду память пзу, я же подразумевал озу. Там выигрыш около 10 байт.
Я про ОЗУ и говорю. Лучше иметь постоянный буфер, нежели его выделять динамически.
Seth,
я не знаю, что Вы там имели в виду, но дословно Вы спросили:
Если не использовать String, как же тогда вывести значение в char. Я понимаю можно передать float как два байта, но как их показать на том же дисплее?
Я сдуру Вам ответил, и показал пример кода, как это делается. В ответ получил "сам дурак". Действительно, дурак. Впредь буду помалкивать.
Чудесно, теперь я виноват в том что вы непонятно на что обиделись.
Извините если мои слова вас чем-то оскорбили. За пример спасибо! Сам наглядно убедился в том что String не есть хорошо. В моем скетче выигрыш более 5kb.
Выбор очевиден.
Проблема решена.
Тема исчерпана.
Всем спасибо за участие!