12/05 Funkcja itoa Problem z wyświetlaniem liczb. Kurs C AVR

Jeżeli masz jakieś uwagi dotyczące bieżącego lub archiwalnych numerów "Elektroniki dla wszystkich" lub zauważyłeś błędy czy nieścisłości to jest to odpowiednie miejsce aby o tym napisać.
ODPOWIEDZ
jareks91
Użytkownik
Posty: 157
Rejestracja: 15 kwie 2005, 13:30

12/05 Funkcja itoa Problem z wyświetlaniem liczb. Kurs C AVR

Post autor: jareks91 » 16 mar 2006, 22:49

Witam,
Natrafiłem na pewien problem. W Grudniowym EDW jest opisywana funckja itoa i jest ona zawarta w funkcji lcd_dec i jak pisze autor ta funcja powinna wypisać 7 znaków czyli 6 cyfr i jeden znak, gdyż bufor jest ustawiony na 7 miejsc.
Wszystko byłoby dobrze, ale nie wiem dlaczego ta funkcja wyświetla MAxymalnie 4 znaki!! Jeśli chcemy wyświetlić liczbe wiecej niż 4 cyfrową to na wyświetlaczu pojawia sie bezsensowna ujemna liczba.
Np liczbę: 6553 dobrze wyświetla natomiast liczbę 65535 wyświetlacz wyświetla jako -1.
Dlaczego tak sie dzieje i jak tą usterke usunąć??
Pozdrawiam

Awatar użytkownika
Koppel
Użytkownik
Posty: 500
Rejestracja: 24 lip 2005, 18:05
Lokalizacja: Gliwice

Post autor: Koppel » 17 mar 2006, 6:41

65535 to liczba z ustawionymi wszystkimi bitami. Najstarczym również. Funkcja itoa przyjmuje wartość typu int. Wartość 65535 zostanie potraktowana jako wartość ujemna - wszystko się zgadza. Próbowałeś może wyświetlić wartości takie jak: 20000? Powinno się zmieścić. Bufor ma 7 znaków ze względu na symbol "-" który jeszcze może pojawić się przed wynikiem. To jest 5 cyfr, symbol znaku oraz zero dla oznaczenia końca łańcucha. Jeśli potrzebujesz wyświetlić większe liczby zainteresuj się funkcją ltoa.

Awatar użytkownika
jejek
-
Posty: 63
Rejestracja: 12 lip 2005, 8:16
Lokalizacja: Będzin
Kontakt:

Post autor: jejek » 17 mar 2006, 9:36

Jak juz napisał kolega, przekroczyłeś zakres wartości dla typu zmiennej. W inkludzie limits.h masz wpis na kształt tego:
#define INT_MAX 2147483647
tylko wartośc masz pewnie 32 tysiące cośtam. Jak ją przekroczysz to zacznie Ci rozpoznawać jako liczby ujemne.

Tutaj masz jak to działa.

Najlepszego, Jejek

jareks91
Użytkownik
Posty: 157
Rejestracja: 15 kwie 2005, 13:30

Post autor: jareks91 » 17 mar 2006, 11:46

Dziękuje, Funkcja ltoa spełnia swoją rolę.
Mam jednak jeszcze małe pytanko. Gdzie mogę znaleźć helpa do winAvr gdzie bede miał opisane funkcje, skladnie, przyklady itp. Np cos takiego jak w Pascalu że wchodze do helpa i mogę sobie wyszukac daną funkcje i zobaczyć jak sie deklaruje itp.
z góry dziekuje
Pozdrawiam

Awatar użytkownika
Koppel
Użytkownik
Posty: 500
Rejestracja: 24 lip 2005, 18:05
Lokalizacja: Gliwice

Post autor: Koppel » 17 mar 2006, 14:53

jareks91 pisze:Gdzie mogę znaleźć helpa do winAvr gdzie bede miał opisane funkcje...
Podstawa to:
C:\WinAVR\doc\avr-libc
Tam znajduje się help w postaci html oraz pdf. Chyba pisałem o tym już w pierwszej części?

Jeśli chodzi o helpa takiego jak w pascalu - takiego raczej nie będzie. Ale w pdf-ie także można się wygodnie poruszać :)

jareks91
Użytkownik
Posty: 157
Rejestracja: 15 kwie 2005, 13:30

Post autor: jareks91 » 21 mar 2006, 19:28

Troszkę nie zbyt czytelny ten help. Nie mogę znaleźć następujących informacji.
Chciałbym wyświetlić na wyświetlacz zmienną typu float czyli z przecinkiem. Czy istnieje taka funkcja? Np żebym jej dodatkowo podawał ile ma wyświetlać miejsc po przecinku?
Drugie pytanie:
Jeżeli w programie napisze a = 2/3 to do zmiennej a ile program wpisze miejsc po przecinku?? CZy można taką zmienną zadelkarować żeby tylko 3 miejsca po przecinku były do niej wpisywane a reszte ucinał??
Prosze o pomoc
Pozdrawiam

Jurek Szczesiul
-
Posty: 13
Rejestracja: 08 paź 2005, 18:20

Post autor: Jurek Szczesiul » 21 mar 2006, 20:40

jareks91 pisze: Chciałbym wyświetlić na wyświetlacz zmienną typu float czyli z przecinkiem. Czy istnieje taka funkcja? Np żebym jej dodatkowo podawał ile ma wyświetlać miejsc po przecinku?
Drugie pytanie:
Jeżeli w programie napisze a = 2/3 to do zmiennej a ile program wpisze miejsc po przecinku?? CZy można taką zmienną zadelkarować żeby tylko 3 miejsca po przecinku były do niej wpisywane a reszte ucinał??
Prosze o pomoc
Pozdrawiam
Cześć
Taka gotowa funkcja to dtostrf - opis w stdlib.h ( tylko trzeba pamiętać , że
chociaż deklaracja jest w stdlib to funkcja jest wkompilowana w libm.a
i musisz libm dolinkować / LDFLAGS +=-lm )

Zapis zmiennej float nie ma bezpośrednio nic wspólnego z dziesiętnymi
miejscami po przecinku - obejrzyj opis standardu IEEE 754 ( ew. EP 5/2005 ).
Jeśli chcesz mieć format stałoprzecinkowy - można np. sprowadzać
wartości do postaci całkowitej ( tzw. normalizacja ) i używać tylko
arytmetyki całkowitej : np. 1.563 + 15.273 zostanie potraktowane jako
1563 + 15273 . Przy wyświetlaniu po prostu wstawiasz kropkę w odpowiednim
miejscu. Trzeba jednak mocno uważać żeby nie przekroczyć zakresów,
np. przy mnożeniu.

I jeszcze najbardziej oczywiste w C ale rzadkie w mniejszych kostkach
( pożera zasoby ) użycie stdio ( fdevopen, printf itd. )

Pozdrowienia Jurek S.

ODPOWIEDZ