sscanf не работает float
- Войдите на сайт для отправки комментариев
Вс, 06/05/2018 - 02:34
Вот уже целый день бьюсь с функцией sscanf пытаясь прочитать значение с плав.точкой.
В результате выполнения приаттаченого кода в терминале получаю 0.00,
Что я делаю не так?
char buf[]="gprmc,5.25";
float x;
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
while (!Serial) {}
}
void loop() {
// put your main code here, to run repeatedly:
sscanf(buf,"gprmc,%f",&x);
Serial.println(x);
while(1);
}
А каким спецификаторам формата соответствует строка gprmc?
На ардуино форматированный вывод float не работает. Логично предположить, что и ввод тоже не работает.
На ардуино форматированный вывод float не работает. Логично предположить, что и ввод тоже не работает.
Ну зачем же так категорично?
void setup() { // put your setup code here, to run once: Serial.begin(115200); float f = sqrt(2.0); Serial.print("float: "); Serial.println(f); double d = sqrt(2.0); Serial.print("double: "); Serial.println(d); char buf[32]; sprintf(buf, "float: %f", f); Serial.println(buf); sprintf(buf, "double: %f", d); Serial.println(buf); } void loop() { // put your main code here, to run repeatedly: }Вывод:
Ну зачем же так категорично?
:-)
не работает в функции sprintf.
andriano, это нечестно :(
На IDE 1.8.5:
А каким спецификаторам формата соответствует строка gprmc?
Она соответствует сама себе - она есть в формате.
Я не оченьхорошо знаком с sscanf. Подскажите как это работает? Нужно вводить именно эти символы? %[gprmc,] - может быть надо как то так? И вопрос к ТС - что возвращает sscanf? В спецификации написано, что 0 это индикация ошибки преобразования.
Давайте начнем издалека.
Во-первых, Arduino != AVR.
Значит, раз на одних контроллерах Ардуино работает, а на других - нет, надо искать, в чем различие.
А различие в том, что на AVR используется нестандартный 4-байтовый double. А по стандарту С/С++ все промежуточные вычисления производятся именно в double. Поэтому стандартные функции С/С++, которые хотят видеть стандартный double, а вместо этого получают float, офигевают от такой наглости и отказываются работать.
Таким образом, высказывание 5N62V необходимо откорректировать:
На AVR форматированный вывод float не работает.
Как заставить работать - вопрос отдельный, но главное - понимать причину того, что происходит.
Спасибо за разяснение, я знал что double с подвыподвертом на arduino, но не подумал что изза этого так косячит стандартная сишная функция.
Интересно как можно заставить ее работать правильно?
вводить число как строку, а потом использовать strtod()