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
12/05 Funkcja itoa Problem z wyświetlaniem liczb. Kurs C AVR
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.
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
#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
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
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
Podstawa to:jareks91 pisze:Gdzie mogę znaleźć helpa do winAvr gdzie bede miał opisane funkcje...
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ć
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
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
Cześć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
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.