Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Wyświetlanie float na ekranie

OlegTor 11 Lut 2019 10:54 177 6
  • #1 11 Lut 2019 10:54
    OlegTor
    Poziom 9  

    Witam,

    Chcę wyświetlić liczbę float np. "23,08" kombinuję z itoa ale mam problemy.
    Kombinuję tak:

    Kod: c
    Zaloguj się, aby zobaczyć kod
    Ale na wyświetlaczu pokazuje się: 23,x8 gdzie x jest przypadkową wartością.

    Program sprawdzam na 32bitowym STM32.
    Chcę żeby można było też wyświetlać liczby ujemne.

    Gdzie tu jest błąd?

    Pozdrawiam.

    0 6
  • #2 11 Lut 2019 13:31
    sylvi91
    Poziom 16  

    Cześć. Użyj funkcji prinf i odpowiednich przełączników.

    Przykład z http://www.cplusplus.com/reference/cstdio/printf/ :

    printf ("floats: %4.2f %+.0e %E \n", 3.1416, 3.1416, 3.1416);

    W twoim przypadku:

    Kod: c
    Zaloguj się, aby zobaczyć kod



    Albo zapis do buforu:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #3 11 Lut 2019 14:05
    OlegTor
    Poziom 9  

    Dzięki za odpowiedź.
    A jak to samo zrobić bez printf?

    0
  • #4 11 Lut 2019 14:26
    sylvi91
    Poziom 16  

    OlegTor napisał:
    Dzięki za odpowiedź.
    A jak to samo zrobić bez printf?


    Można właśnie kombinować z itoa, lecz funkcja ta nie należy do standardowej i lepiej użyć sprintf albo bezpośrednio printf. Ponadto itoa konwertuje wartośc integer do stringa umieszczając znak końca danego łacucha (NULL). Może dlatego właśnie masz tam złą wartość po przeliczeniu swoim sposobem.

    Na tej stronie jest wyjaśnienie.

    http://www.cplusplus.com/reference/cstdlib/itoa/

    Cytat:

    Convert integer to string (non-standard function)
    Converts an integer value to a null-terminated string
    ... and ...
    This function is not defined in ANSI-C and is not part of C++, but is supported by some compilers.
    A standard-compliant alternative for some cases may be sprintf:


    Jeśli chcesz się bawić mimo to z itoa to może przed wyświetleniem bufora kopiuj stringi za pomocą strncpy().

    0
  • #5 11 Lut 2019 15:10
    OlegTor
    Poziom 9  

    Jeśli chodzi o sprintf to jak można sformatować tekst wyświetlany aby zawsze były wyświetlane dwie cyfry po przecinku nawet jeśli równają się zero np. 12.00?

    0
  • #6 11 Lut 2019 15:49
    sylvi91
    Poziom 16  

    Chyba masz dwa wyjścia, ale potestuj bo teraz nie jestem pewien.

    zrobić printf() z parametrem %5.2f dla liczby jak twoja np. 12.00.

    albo zamiast sprintf() użyj snprintf() gdzie drugi parametr (n) ustaw zależnie od tego ile cyfr chcesz skopiować i wyświetlać.

    int snprintf ( char * s, size_t n, const char * format, ... );

    Cytat:
    Write formatted output to sized buffer
    Composes a string with the same text that would be printed if format was used on printf, but instead of being printed, the content is stored as a C string in the buffer pointed by s (taking n as the maximum buffer capacity to fill).

    0
  • #7 13 Lut 2019 20:37
    LED5W
    Poziom 32  

    OlegTor napisał:
    Kod: c
    Zaloguj się, aby zobaczyć kod
    [...]
    Gdzie tu jest błąd?

    100 * liczba == 2308
    100 * liczba % 100 == 8
    Wstawiasz tą ósemkę na pozycję o indeksie 4 a pod indeksem 3 niczego nie zapisujesz.

    sylvi91 napisał:
    zrobić printf() z parametrem %5.2f dla liczby jak twoja np. 12.00.

    albo zamiast sprintf() użyj snprintf() gdzie drugi parametr (n) ustaw zależnie od tego ile cyfr chcesz skopiować i wyświetlać.
    Funkcja snprintf nie jest alternatywą dla .2f w parametrze. To zabezpieczenie przed przepełnieniem bufora. W przypadku użycia sprintf lub itoa trzeba sprawdzić, czy liczba nie jest zbyt duża lub zbyt mała, albo zapewnić odpowiednio duży bufor dla dowolnej liczby danego typu.

    0