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



Teraz jest 16 kwi 2024, o 14:02


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 11 ] 
Autor Wiadomość
PostNapisane: 19 kwi 2015, o 15:44 

Pomógł: 0

Cytuj:
W przypadku zmiennych ze znakiem sam muszę pilnować ich maksymalnej wartości?


Z mojego (maluśkiego) doświadczenia programistycznego wiem, że każdy kompilator/system ma swoje zakresy zmiennych. Tj. nie jest tak ze w każdym int będzie oznaczał +-32768

Sprawdź przez sizeof rzeczywistą wielkość int w twoim systemie tj. w kompilatorze PICa.



Góra
  
cytowanie selektywne  Cytuj  
PostNapisane: 20 kwi 2015, o 07:46 
Offline
Użytkownik

Dołączył(a): 26 lut 2014
Posty: 227
Lokalizacja: LDZ
Pomógł: 22

Skoro counter jest liczbą int ze znakiem to nigdy nie będzie większy od 32767. Dlatego masz warninga.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 kwi 2015, o 19:21 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 31 mar 2015
Posty: 310
Pomógł: 18

Sanuję za spostrzeżenie i wskazanie nieścisłości jakie wynikają przy interpretacji wyników pracy maszyn cyfrowych.
Liczba 32767 = 7FFF, jest 15-to bitowa. To, to co obchodzi rejestr TCNT(16-bitowy), że obserwator monitora ma błędny odczyt.
A niech se stosuje ltoa.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 kwi 2015, o 21:50 
Offline
Moderator
Avatar użytkownika

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

Antystatyczny napisał(a):
czyli pilnuję we własnym zakresie, by int nie przekroczył wartości 32767

Ależ nic nie pilnujesz we własnym zakresie ;) .... int nigdy nie przekroczy 32767 ;)

Antystatyczny napisał(a):
            counter++;//   <-----int, a mimo to nalicza do 65535
            lcd_locate(1,0);
            lcd_int(counter);//zastosowana funkcja itoa

Nic nie nalicza do 65535 - tylko zajrzyj pan do funkcji lcd_int() ;) .... boć przecież jeśli masz w niej np (strzelam tak) argument typu uint16_t czy tam unsigned int, albo w środku jeszcze inną funkcję np utoa() .... to ty się nie dziw, że gubisz swój typ int, wpuszczasz go w maszynkę do mielenia mięsa, która przerabia go na kotlet bez znaku ... i tylko tak wyświetla ....

przecież typy to rzecz umowna a bity działają tak jak wyżej mokrowski napisał w U2. I to ty musisz wiedzieć jakimi typami po drodze operujesz

przemyśl co się stanie gdy napiszesz tak


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


a przemyśl co będzie gdy napiszesz:

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


A jak chcesz prawidłowo wyświetlać int w lcd_int() to jak mówię zajrzyj do funkcji lcd_int() i sprawdź wszystkie trybiki tej maszynki ;)

_________________
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: 21 kwi 2015, o 07:33 
Offline
Moderator
Avatar użytkownika

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

mokrowski napisał(a):
Mirek, być może źle zrozumiałem Twoją wypowiedź, ale nie zgadzam się co do jednego.

To może ja inaczej powiem, ale tzn dopytam bo może ja nie wiem ...

przykładowy kod:

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


jaka liczba się wyświetli na LCD gdy a dojdzie do wartości (teoretycznie wg nas) do 32768 ?

zakładając, że lcd_int() zbudowana jest mniej więcej tak:

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


Wg tego co pisałem wyżej oczywistym (tzn dla mnie oczywistym jest), że wyświetli się -32768

I teraz uwaga - ja myślę i mówię tylko w kategoriach AVR GCC więc absolutnie nie twierdzę, że to dotyczy wszystkich innych kompilatorów bo po prostu nie wiem, a jak nie wiem to nie będę się mądrzył ;) Jednak na podstawie tak prostej analogii wydaje mi się (hmmm wydawało mi się), że każdy kompilator tak się zachowa w tym opisanym teraz wyżej przeze mnie przypadku.

dlatego proszę potwierdź/rozwiej moje wątpliwości ok ?

Naturalnie zgadzam się, że trzeba ZAWSZE pilnować typów ale nie spodziewałbym się wręcz, że kompilator będzie robił mi w przypadku powyżej psikusa i pokaże liczbę dodatnią ? .... Przy czym wyświetlanie to pal pies ... gorzej gdyby w warunkach jakichś np if() miało to się tak rąbać ...

stąd ciekaw też jestem jak to się ostatecznie zachowuje w kompilatorze u Antystatycznego teraz ?

mokrowski napisał(a):
No bo co się może dziać jeśli INT będzie indeksem? Po osiągnięciu 32767, skoczy na wartość ujemną która będzie poza tablicą.

I jeszcze jedno - może rzeczywiście zrobiłem skrót myślowy i pisząc, że nie trzeba pilnować typów nawet przez myśl mi nie przeszło, żeby w takiej sytuacji nie pilnować ;) .... Podałem wyżej przykład - chodziło mi o pilnowanie w takich prostych przykładach porównania - i ciekaw jestem czy zgadłem , że np u Antystatycznego ta liczba dodatnia pojawiała się dlatego że u niego np lcd_int() wyglądał tak:

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


Bo chyba to oczywiste, że w takim wypadku to normalne że zobaczymy 32768 po przekroczeniu zmiennej counter (z pierwszego przykładu) a nie -32768

------------------------ [ Dodano po: 1 minucie ]

mokrowski napisał(a):
Notacja U2 (z uzupełnieniem do 2), tak opracowano by operacje ze znakami (+/-...), kończyły się bezpiecznie ,,w objętości danego typu".

O! mi chodziło bardziej o to właśnie ;) że pod tym względem nie trzeba pilnować

_________________
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: 21 kwi 2015, o 07:47 

Pomógł: 0

Mówiąc słowami laika.

Za każdym razem zmieniając kompilator trzeba dowiedzieć się jak są reprezentowane liczby, bo int w systemie 8 bitowym to nie to samo co w 32 czy 64 bitowym, to jest zależne mocno od samego systemu.

Podobnie stwierdzenie użyj notacji U2, wymaga odpowiedniego traktowania przez użytkownika liczby, ewentualnie zastosowanie odpowiednich narzędzi kompilatora by ta prezentacja U2 była interpretowana jak U2.

Niby prosta rzecz, a jak widać nie do końca.



Góra
  
cytowanie selektywne  Cytuj  
PostNapisane: 21 kwi 2015, o 08:01 
Offline
Moderator
Avatar użytkownika

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

rezasurmar napisał(a):
bo int w systemie 8 bitowym to nie to samo co w 32 czy 64 bitowym

Wydaje mi się (podkreślam wydaje) ;) , że to samo jeśli chodzi o sposób działania/obsługi .... a to że technicznie się różnią bo mają różne pojemności (w bajtach) no to już całkiem inna bajka ...

Nie mniej ciekaw jestem czy potwierdzicie, że inny kompilator w przykładach które wyżej podałem zachowa się tak - że pokaże liczbę dodatnią zamiast ujemnej ? Pytam bo nie za wiele kompilatorów C używałem.

_________________
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: 21 kwi 2015, o 08:06 

Pomógł: 0

mirekk36 napisał(a):
Nie mniej ciekaw jestem czy potwierdzicie, że inny kompilator w przykładach które wyżej podałem zachowa się tak - że pokaże liczbę dodatnią zamiast ujemnej ? Pytam bo nie za wiele kompilatorów C używałem.


Ja też nie jestem jakiś tam super doświadczony, ale wiem że trzeba było tego pilnować, bo na PC było inaczej, na 8051 też.

Zresztą sam nigdy nie zostawiałem zmiennych samej sobie ;), tj. nie świadomie :lol:



Góra
  
cytowanie selektywne  Cytuj  
PostNapisane: 21 kwi 2015, o 08:37 
Offline
Moderator
Avatar użytkownika

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

rezasurmar napisał(a):
Zresztą sam nigdy nie zostawiałem zmiennych samej sobie

Ale my tu mówimy o konkretnym przypadku ;)

rezasurmar napisał(a):
tj. nie świadomie

Wiesz ... to ja słyszałem taką teorię, że jeśli w programie zostanie przekroczona pewna ilość if()'ów to wtedy program zaczyna żyć własnym życiem :lol:

_________________
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: 21 kwi 2015, o 13:16 
Offline
Moderator
Avatar użytkownika

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

mokrowski napisał(a):
Może interpretowana owszem, ale jak wyświetlona?. Tu jest ,,meksyk"

No ok ;) ... jak mówię nie bawiłem się innymi kompilatorami to ciężko mi się wypowiadać ale tym bardziej ciekaw jestem co tam ma Antystatyczny w środku swojego lcd_int() ? ;)

_________________
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: 22 kwi 2015, o 17:20 
Offline
Moderator
Avatar użytkownika

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

mokrowski napisał(a):
Eh.. żeś namieszał :-) Ale fajnie, ciekawa dyskusja wynikła i mogłem sobie przypomnieć jak to dziwnie z tymi typami jest :-)

Nie chcę mówić, że wyszło na moje ;) ... to tak pół żartem mówię - bo doceniam twoje mega cenne (jak zwykle zresztą wskazówki, linki itp) ... ale tutaj no jakby nie patrzeć kompilator zachował się całkowicie przewidywalnie - jak dla mnie, i fajnie. Ale tak jak mówisz - ty sobie przypomniałeś mega zaawansowane rzeczy a nam maluczkim podpowiedziałeś i wskazałeś gdzie należy patrzeć - gdy spotkamy się z takim problemem w innym kompilatorze. Dlatego też uważam tę dyskusję za bardzo cenną - już nie mówiąc o tym, że fajnie - że jesteś pan - panie mokrowski z nami na forum ;) ... Rzekłbym skarbnica wiedzy w tobie i to otwarta ... Ja dziękuję za garść cennych informacji.

_________________
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: 11 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

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


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:  
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO