Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 19 lut 2025, o 16:01


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 6 ] 
Autor Wiadomość
PostNapisane: 10 lut 2013, o 12:19 
Offline
Użytkownik

Dołączył(a): 14 sty 2013
Posty: 36
Pomógł: 2

Wiem, że bardzo częso zamiennie używane są rożne nazwy dla określonego typu.
char = int8_t (zakres -128...127)
unsigned char = uint8_t (zakres 0..255)

O ile to jest jasne i jest tylko kwestią umowną to poniższy zapis już nie jest dla mnie jednoznaczny, a jest prawidłowy.
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


"Sprawa" wyszła zupełnie przypadkowo podczas testowania wyświetlacza LCD.
Sprawdzałem tablicę znaków i chciałem wyświetlić z niej znak o kodzie 0xA6 (0b10100110) ale zauważyłem taką deklarację funkcji
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


czyli teoretycznie zakres -128 .. 127 a akurat ten znak ma wartość 166 zaraz przypomniał mi sie rozdział z niebieskiej książki o typach i ich zakresie.

Jaki jest sens stosowania signed unisgned jeżeli widac na załaczonym ponizej przykładzie, że jeżeli wykonujemy nawet operacje arytmetyczne na liczbach ze znakiem czy bez to ważna jest tylko "wielkość" zmiennej a nie jej zakres.

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


I jeszcze jedno pytanie np. odnośnie deklaracji funkcji

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


dla jasnosci kodu zamiast char powinno być uint8_t lub unsigned char bo wskaźnik nie może być ujemny - czy warto tak rozumowac? (chodzi mi tylko o wyrobienie od poczatku dobrych nawyków w pisaniu).

no i przy tej funkcji jeszcze małe pytanko. Czy dla ATmega 32 wielkośc 8 bitów dla wskaźnika do EEPROM nie jest zbyt mala? Ma on wielkość 1024 bajty więc adres mieści się w 10 bitach.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 lut 2013, o 13:10 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27359
Lokalizacja: Szczecin
Pomógł: 1042

na razie to jeszcze stąpasz po grząskim gruncie i bardzo niepewnie ....

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


jest poprawne ponieważ domyślnie (a pewnie o tym jeszcze nie wiesz) kompilator wywołuje opcję, która zamienia char na unsigned char, po co ? po to żeby nie trzeba było w kółko pisać tego unsigned właśnie. Naturalnie mowa o kompilatorze AVR GCC bo inne tego nie robią

po drugie

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


tu wcale nie powinien być uint8_t tylko tak jak jest char .... dlaczego ?

ano dlatego i postaraj się to sobie dobrze zapamiętać - w języku AVR GCC jeśli masz posługiwać się znakami ASCII to stosuj typ char a nie uintxxx i odwrotnie, jeśli stosujesz zmienne liczbowe to nie stosuj char.

oznacza to że taki zapis

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


oczywiście zadziała w pełni poprawnie to z punktu widzenia poprawnego programowania jest to BŁĄD. Powinno być tak:

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


rozumiesz?

------------------------ [ Dodano po: 3 minutach ]

strzelec napisał(a):
dla jasnosci kodu zamiast char powinno być uint8_t lub unsigned char bo wskaźnik nie może być ujemny - czy warto tak rozumowac? (chodzi mi tylko o wyrobienie od poczatku dobrych nawyków w pisaniu). .


No a to zdanie niestety oznacza że na razie też nie wiesz co to jest TYP wskaźnika :(

oczywiście że można byłoby użyć takich typów do wskaźników zobacz:

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


czy w tym wypadku powiedziałbyś że wskaźnik może być ujemny ???? nigdy w życiu .... TYP w tym przypadku mówi ci o tym na jaki obiekt wskazuje wskaźnik, a niezależnie od tego typu sam wskaźnik jest ZAWSZE dwubajtowy i bez znaku.

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 lut 2013, o 13:15 
Offline
Uzytkownik zasłużony dla forum.atnel.pl
Avatar użytkownika

Dołączył(a): 16 lip 2012
Posty: 2088
Lokalizacja: Leżajsk / Kraków
Pomógł: 411

Możesz nawet zrobić tak:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

W wielu przypadkach może to nie mieć znaczenia, czy zmienna jest ze znakiem, czy bez bo i tak zawsze przechowywana jest na bajcie czy kilku bajtach w zależności od rozmiaru, ale są przypadki, gdzie to odgrywa rolę, np.:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Było tak samo a jest inaczej.

_________________
Dragonus Cracovus: Biomagia



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 lut 2013, o 13:20 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 05 sty 2013
Posty: 272
Pomógł: 3

Po pierwsze char i int8_t to dokładnie to samo, chodzi jedynie o nawyk programisty. W char trzymamy kod pojedynczego znaku a w int trzymamy liczbę.

Co do pytania: zmienna, gdy dostanie za dużą/małą wartość po prostu się "przekręca", nie powiem Ci jak dokładnie to działa bo po prostu nie pamiętam.

@Krauser
Jesteś pewien? Zmienne ze znakiem są w kodzie uzupełnień U2, bo jak inaczej procesor miałby wiedzieć, że to jest ze znakiem?

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 lut 2013, o 13:31 
Offline
Użytkownik

Dołączył(a): 14 sty 2013
Posty: 36
Pomógł: 2

Właśnie chodzi o te nawyki programisty.
Mirek dzięki za wyjaśnienie, faktycznie nie wiedziałem o zamianie char na unsigned char. A co do wskaźnika to zapomnijmy o tym :oops:



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 lut 2013, o 13:52 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27359
Lokalizacja: Szczecin
Pomógł: 1042

arturf209 napisał(a):
@Krauser
Jesteś pewien? Zmienne ze znakiem są w kodzie uzupełnień U2, bo jak inaczej procesor miałby wiedzieć, że to jest ze znakiem?


przeanalizuj sobie przykłady które podał Krauser bo prześlicznie pokazują właśnie to że procesora nie obchodzi czy ma w rejestrze liczbę ujemną czy nie ? .... to jest tylko kwestia umowna, popatrz sobie na te dwie liczby

-128

i

128

obydwie mają IDENTYCZNY zapis bitowy w bajcie pomimo że jedna jest w kodzie uzupełnień do dwóch ;)

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 6 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 6 gości


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
cron
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO