String(5.3456,2) = ""???

Seth
Offline
Зарегистрирован: 01.02.2014

Добрый день.

Вопрос собсетно в теме.

String() не преобразует double/float в строку. На выходе пустота.

В чем может быть проблема, как исправить?

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Скетч можно приложить? Конкретный, который "не работает". Конструкторы 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);
}

 

vk007
Offline
Зарегистрирован: 16.06.2015

Не помню, как насчет String, а вот, например, sprintf и некоторые другие функции в версии 1.0.5 у меня не захотели обрабатывать float. А в 1.6.5 - без проблем. Экспериментировал, как попроще преобразовать float в строку с нужным мне форматированием. После чего сделал вывод, что в старых версиях с этим проблема.

Seth
Offline
Зарегистрирован: 01.02.2014

После танцев с бубном, сделал вывод что функции нехватает свободной памяти. 277 байт мало, а вот при 314 уже работает. 

vk007
Offline
Зарегистрирован: 16.06.2015

И все-таки, какая у вас версия? Я экспериментировал на меге с отдельным скетчем, в котором, кроме самой функции, был только вывод в сериал результата. Не думаю, что меге да и не хватало памяти.

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Seth пишет:

После танцев с бубном, сделал вывод что функции нехватает свободной памяти. 277 байт мало, а вот при 314 уже работает. 

Это еще один из поводов не использовать плавающую арифметику и класс String, либо брать Ардуину типа меги2560.

 

Seth
Offline
Зарегистрирован: 01.02.2014

А если очень нужно дробное значение. Использовать float = int * 100?

Если не использовать String, как же тогда вывести значение в char. Я понимаю можно передать float как два байта, но как их показать на том же дисплее?

Seth
Offline
Зарегистрирован: 01.02.2014

vk007 пишет:

И все-таки, какая у вас версия? Я экспериментировал на меге с отдельным скетчем, в котором, кроме самой функции, был только вывод в сериал результата. Не думаю, что меге да и не хватало памяти.

Версия 1.5.6r2

чип atmega328 NANO

Что интересно Serial.println(float, 2) работал нормально, что и несколько усложнило поиск проблемы.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Seth пишет:

А если очень нужно дробное значение. Использовать float = int * 100?

Если не использовать String, как же тогда вывести значение в char. Я понимаю можно передать float как два байта, но как их показать на том же дисплее?

String не единственный и не самый эффективный метод преобразовать float/double в char.

Сравните:

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" штифтом.

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

С дробными значениями - зависит от задачи, а со String - не столь важно сколько занимает скетч, сколько он будет жрать ОЗУ. Для преобразований проще выделить статический буфер, с ним и работать, нежели String будет выделять память динамически. Динамика - это куча проблем и иногда непредсказуемое поведение скетча.

Seth
Offline
Зарегистрирован: 01.02.2014

В данном случае вы имете ввиду память пзу, я же подразумевал озу. Там выигрыш около 10 байт.

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Я про ОЗУ и говорю. Лучше иметь постоянный буфер, нежели его выделять динамически.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Seth,

я не знаю, что Вы там имели в виду, но дословно Вы спросили:

Seth пишет:

Если не использовать String, как же тогда вывести значение в char. Я понимаю можно передать float как два байта, но как их показать на том же дисплее?

Я сдуру Вам ответил, и показал пример кода, как это делается. В ответ получил "сам дурак". Действительно, дурак. Впредь буду помалкивать.

Seth
Offline
Зарегистрирован: 01.02.2014

ЕвгенийП пишет:

Я сдуру Вам ответил, и показал пример кода, как это делается. В ответ получил "сам дурак". Действительно, дурак. Впредь буду помалкивать.

Чудесно, теперь я виноват в том что вы непонятно на что обиделись.

Извините если мои слова вас чем-то оскорбили. За пример спасибо! Сам наглядно убедился в том что String не есть хорошо. В моем скетче выигрыш более 5kb.

Выбор очевиден.

Проблема решена.

Тема исчерпана.

Всем спасибо за участие!