logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

AVR sprintf float - Formatowanie float'ów w sprintf

narasta 11 Lis 2013 12:20 2973 6
  • #1 12939049
    narasta
    Poziom 21  
    Mam pytanie co do pritfa i floata - jak sformatować tekst, aby %f wyświetlało zawsze tak wynik, że przecinek był w tym samym miejscu niezależnie od tego czy liczba przed przecinkiem jest jedno czy dwu cyfrowa? chodzi mi o to samo co w przypadku %2d - wtedy jednostki są zawsze w jednej kolumnie jeśli wyświetla się wartości jedna pod drugą.


    Powiem tylko, że ku mojemu zdziwieniu wpisanie np %2.2d dla 1,23, nie powoduje wyświetlenia liczby w postaci " 1.23" tylko "1.23". Na logikę powinno dodawać spacje przed liczba dziesiętną, ale tego nie robi (w referencie to printfa także nie dodaje - nie rozumiem czemu.
  • #2 12939141
    tehaceole

    Poziom 28  
    A w jakimż to celu używasz floatów w skromnych AVR...? =/
  • #3 12939145
    dondu
    Moderator na urlopie...
    Po pierwsze format d służy dla liczb dziesiętnych całkowitych ze znakiem. Ty operujesz liczbą zmiennoprzecinkową, czyli potrzebny jest format f.
    Po drugie pierwsza liczba oznacza szerokość całego pola więc powinieneś mieć ustawioną ją na 5 (bo oczekujesz pięciu znaków wraz z początkową spacją włącznie), czyli:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Szczegóły: http://mikrokontrolery.blogspot.com/2011/02/printf-instrukcja-rodzina.html
    Sprawdź sobie w kompilatorze CManiak dostępnym w powyższym artykule.
  • #4 12939210
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Google odnajduje 8 milionów stron na zapytanie "printf". Już pierwsze 6 wyników to dokumentacja tej własnie funkcji z pełnym opisem, wynik drugi, trzeci, piąty i szósty są po polsku. Nie można po prostu poczytać, tylko ze wszystkim od razu na forum?

    4\/3!!
  • #5 12939256
    dondu
    Moderator na urlopie...
    ... Freddy ma sporo racji, choć akurat formatowanie liczb, może nastręczać problemów początkującym :)

    BTW:

    Freddie Chopin napisał:
    ... wynik drugi, trzeci, piąty i szósty są po polsku.

    To zależy, kto szuka:

    AVR sprintf float - Formatowanie float'ów w sprintf
  • #6 12939529
    narasta
    Poziom 21  
    O i tej informacji mi brakowało, że pierwsza liczba oznacza długość całego pola, a nie ilość przed przecinkiem. Chyba mnie zamroczyło i niedokładnie przeczytałem
    Minimum number of characters to be printed. If the value to be printed is shorter than this number, the result is padded with blank spaces. The value is not truncated even if the result is larger.
    Gdzie jak byk pisze, że to całą długość a nie tylko przed przecinkiem

    Do tej pory korzystałem z dtostrf dla floatów i dla intów z itoa badź ltoa - w aktualnym projekcie musiałem znaleźć alternatywę utylizującą każde możliwe formatowanie.

    Co Wy macie do tych floatów :P - każdy wie że z tego się korzysta tylko w ostateczności, ale jeśli do dyspozycji jest jeszcze pamięć procesora i jego czas to czemu nie. W tym przypadku floaty są liczone dopiero przed samym wyświetleniem na LCD bądź uarcie. Generalnie nie są na nim przeprowadzane żadne operacje, a raczej przemnożenie inta przez stałego floata i od razu wyświetlenie. Poza tym, jeżeli kod jest mądrze napisany i sensownie zoptymalizowany (jeszcze przez programistę, a nie kompilator) to nic ma w nic złego we floacie.

    To tak jakby wybierać autem drogę po asfalcie na długości 10km (inty i reczne wstawianie przecinka) lub na skróty po dziurach 0,5km (float). Jeśli ten skrót obieramy odpowiednim pojazdem to nie ma żadnego problemu.

    W tym momencie cały projekt składa się obsługi RTC, karty SD (fatfs), uart, LCD, wew ADC, zew. DAC, . Po prostu nie chce mi się jeszcze pisać ręcznie obsługi liczb zmiennoprzecinkowych na intach.

    Więc proszę Was - nie przezywajcie tak tych floatów, bo widzę, że tylko jak przy okazji AVRa pojawi się słowo float to od razu jest wrzawa...

    A dyskusji na temat tego czy się jest początkującym czy nie, nawet nie rozpoczynam.
  • #7 12939552
    dondu
    Moderator na urlopie...
    narasta napisał:
    Co Wy macie do tych floatów :P
    ...
    Więc proszę Was - nie przezywajcie tak tych floatów, bo widzę, że tylko jak przy okazji AVRa pojawi się słowo float to od razu jest wrzawa...

    Nie pisz w liczbie mnogiej, bo tylko kol. tehaceole ten temat poruszył.
    Poza tym nie widzę by kol. tehaceole robił "wrzawę", tylko zadał pytanie.

    narasta napisał:
    A dyskusji na temat tego czy się jest początkującym czy nie, nawet nie rozpoczynam.

    Nie miałem na myśli Ciebie, tylko generalnie początkujących, bo rodzina funkcji printf jest takim tematem.
REKLAMA