Skocz do zawartości

Arduino - Błąd konwersji float przez sprintf


Pomocna odpowiedź

Napisano

Witam !

Tak jak w temacie mam problem przy konwersji float.

sprintf( buf, "Wartosc kupiona %.2f L wartosc zmierzona %.2f L\0",liters[i],(float)totalMilliLitres/1000);

gdzie buf to tablica char o rozmiarze 256, liters to tablica floatów, a totalMiliLiters to int.

Po wyświetleniu tej tablicy na monitorze portu szeregowego w miejcu wartości mam "?".

To jest jakiś błąd IDE ?

Pozdrawiam

Arduino nie obsluguje floatów w funkcjach *printf. Jest na to jakiś sposób ale nie pamiętam jak to się robiło - na arduino.cc powinieneś coś znaleźć.

Porażką to byłoby printf obsługujące wszystkie możliwe formaty, ładujące z definicji bibliotekę zmiennoprzecinkową i zajmujące 1/3 pamięci małego procesorka. Tak, są inne sposoby na wyświetlanie wartości float, wystarczy poszukać czegoś o "Arduino floating point printf", np:

http://yaab-arduino.blogspot.com/2015/12/how-to-sprintf-float-with-arduino.html

Pomyśl czy w ogóle musisz używać zmiennych typu float. Dopóki nie potrzebujesz ogromnego zakresu dynamicznego zmiennego przecinka, to swoje obliczenia możesz spokojnie wykonywać przy użyciu wyłącznie intów, choćby 32-bitowych, przyjmując jakiś ładny format stałoprzecinkowy np. 24.8 lub 16.16. Kod jest szybszy i krótszy, ale wymaga chwili zastanowienia przed napisaniem. Fakt, to nie jest popularne podejście w Arduino.

Porażka to by była, gdyby funkcja sprintf zajmowała połowę pamięci na szkic przy czym 99.9% ludzi nie używałoby połowy tego kodu.

O ile mnie pamięć nie myli, libc jest na licencji lgpl, źródła są dostępne, możesz zerżnąć sprintfa w pełnej wersji choćby ze źródeł glibca i skompilować na Arduino. Tylko - jak już pisał marek1707 - po co ?

Tak przy okazji żeby być dokładnym: funkcja sprintf w Arduino nie jest pisana specjalnie pod niego, a pochodzi po prostu z avr-libc (na którym Arduino bazuje). Poczytaj sobie o avr-libc, dlaczego jest tak a nie inaczej, a potem się zastanów czy porażką jest nieobsługiwanie floatów przez avr-y - czy to, że nie wiesz dlaczego.

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...