Skocz do zawartości

Arduino - Błąd konwersji float przez sprintf


Duszek

Pomocna odpowiedź

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

Link do komentarza
Share on other sites

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.

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

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.

Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.