String(5.3456,2) = ""???
- Войдите на сайт для отправки комментариев
Втр, 04/08/2015 - 16:18
Добрый день.
Вопрос собсетно в теме.
String() не преобразует double/float в строку. На выходе пустота.
В чем может быть проблема, как исправить?
Скетч можно приложить? Конкретный, который "не работает". Конструкторы String выглядят вполне рабочими. Хотя ни float, ни String стараюсь не использовать.
Не помню, как насчет 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 как два байта, но как их показать на том же дисплее?
Сравните:
занимает 4504 байта (если моя IDE не врёт)
А программа, делающая тоже самое, но без String
занимает 3018 байтов! Т.е. в полтора раза меньше!
Вот и думайте, что использовать.
У String много полезных методов, но использовать его ради только преобразования ... это как если бы Вам нужно было программно Reset'нуть ардуину и Вы бы для этого стали поключать к ней сервопривод с нажимающим на кнопку "Reset" штифтом.
С дробными значениями - зависит от задачи, а со String - не столь важно сколько занимает скетч, сколько он будет жрать ОЗУ. Для преобразований проще выделить статический буфер, с ним и работать, нежели String будет выделять память динамически. Динамика - это куча проблем и иногда непредсказуемое поведение скетча.
В данном случае вы имете ввиду память пзу, я же подразумевал озу. Там выигрыш около 10 байт.
Я про ОЗУ и говорю. Лучше иметь постоянный буфер, нежели его выделять динамически.
Seth,
я не знаю, что Вы там имели в виду, но дословно Вы спросили:
Если не использовать String, как же тогда вывести значение в char. Я понимаю можно передать float как два байта, но как их показать на том же дисплее?
Я сдуру Вам ответил, и показал пример кода, как это делается. В ответ получил "сам дурак". Действительно, дурак. Впредь буду помалкивать.
Чудесно, теперь я виноват в том что вы непонятно на что обиделись.
Извините если мои слова вас чем-то оскорбили. За пример спасибо! Сам наглядно убедился в том что String не есть хорошо. В моем скетче выигрыш более 5kb.
Выбор очевиден.
Проблема решена.
Тема исчерпана.
Всем спасибо за участие!