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



Teraz jest 28 gru 2024, o 12:57


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 10 ] 
Autor Wiadomość
PostNapisane: 25 lis 2012, o 08:49 
Offline
Nowy

Dołączył(a): 27 paź 2012
Posty: 14
Pomógł: 0

Witam
Czy można ustawić w C zakres zmiennej, np. dla 16bitowej zmiennej unsignet int (0-65535),chciałby żeby np. zmieniała się w programie tylko w zakresie 0-2000, wiem że mogę to zadeklarować w fragmencie programu np. przy obsłudze zwiększania/zmniejszania zmiennej za pomocą klawiszy, ale czy można to zrobić na samym początku programu kiedy deklarujemy np.
Kod:
unsignet int  a;

żeby już na początku zagrodzić możliwość występowania jej w przykładowym przedziale 0-2000.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 lis 2012, o 09:07 
Offline
Moderator
Avatar użytkownika

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

Tzn pytanie wynika troszkę z niezrozumienia typów.

typy zmiennych nie zostały wymyślone po to aby wprowadzać jakieś tam sztuczne ograniczenia. Wiążą się one ściśle z ilością BAJTÓW które przypadają na dany typ. Przy czym nazwa typu jest ściśle umowna.

a zatem, jaki zakres uzyskasz w jednym bajcie ???

chyba rozumiesz, że chcąc nie chcąc od 0 do 255 bo to wynika z wag poszczególnych bitów

128+64+32+16+8+4+2+1

i teraz nie ważne czy nazwiesz ten typ: unsigned char, uint8_t itd - to zawsze musisz pamiętać że jej zakres zależy od ilości bajtów. Skoro jest jeden to masz od 0 do 255

jeśli weźmiesz dwa bajty, to wtedy masz od 0 do 65535

no ale tu mówimy o liczbach całkowitych bez znaku. Tymczasem jak weźmiesz sobie np typ:

char czy int8_t to masz zakres od -128 do 127

jeśli typ: int lub int16_t to masz zakres od -32768 do 32767

więc rozumiesz już chyba, że nie ma tu mowy o jakichś innych ograniczeniach niż rozmiary związane z bajtami. Całą resztę robisz sobie programowo i wcale nie musi to zależeć od jakichś klawiszy - jak piszesz wyżej. W dowolnej części programu możesz to robić. Żeby to lepiej zrozumieć spróbuj sobie prześledzić jak wyglądają binarne postaci takich liczb (typów), dla uproszczenia weźmy tylko 4 bity

0000 - 0
0001 - 1
0010 - 2
0011 - 3
0100 - 4
0101 - 5
0110 - 6
0111 - 7
1000 - 8
1001 - 9
1010 - 10
1011 - 11
1100 - 12
1101 - 13
1110 - 14
1111 - 15

;) .... czyli liczby od 0 do 15. Gdyby był taki typ to taki miałby zakres. Wiadomo że jeśli do

1111 + 1 = 0000

dlatego się licznik przekręca

a jak sobie wyobrażasz teraz np ograniczenie tego zakresu do np od 0 do 11 ???, przecież jeśli

1011 + 1

to będzie się to równać

1100 czyli = 12

więc żeby robić takie ograniczenia to procesory musiałyby mieć co ? wszczepione jakieś moduły sprzętowe do pilnowania tych zakresów ? a co z typami ? z językami ? sprzęt to sprzęt i jest niezależny od języka w tym względzie ;)

teraz jaśniej ?

_________________
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: 25 lis 2012, o 10:21 
Offline
Nowy

Dołączył(a): 27 paź 2012
Posty: 14
Pomógł: 0

Steruje przykładowo za pomocą zmiennej "a" (8 bitowej) termostatem, i na wyświetlaczu wchodzę w menu,
Kod:
      void przyciski(void)
     {
     if(SW_DOWN)   //naciśnięcie switcha DOWN
     {a-=5;            // zmniejsz temp. zadaną o 5`C
      _delay_ms(5);}
      while(SW_DOWN);
         
     if(SW_UP)
     {a+=5;
      _delay_ms(5);}
      while(SW_UP);
     }


ustawiam przyciskami UP/DOWN np. 45`C zmianiam na 60`C, tylko chodzi mi o to żeby np. jak będę zwiększał przyciskiem UP nie móc zwiększyć temperatury zadanej czyli zmiennej "a", więcej niż do 100`C, bo jak będę wielokrotnie naciskał UP to przekrocze to 100 i wejdę nawet na 255, a zakres mojego termostatu jest 30 - 100`C
Napisałem sobie formułe która programowo nie pozwala zwiększać zmiennej "a" jeśli ta np. osiągnie już 100st. myślałem że da się to ograniczyć już przy samej definicji zmiennej na samym początku programu, żeby późnieje nie komplikować kodu.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 lis 2012, o 10:31 
Offline
Moderator
Avatar użytkownika

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

No tak - ale już wytłumaczyłem dlaczego tak nie można i to w żadnym języku programowania. A co to za komplikacja w kodzie dodać po jednej linijce

Kod:
a+=5;
if(a>100) a=100;


takie coś występuje i stosuje się w każdym języku programowania.

_________________
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: 25 lis 2012, o 10:34 
Offline
Nowy

Dołączył(a): 27 paź 2012
Posty: 14
Pomógł: 0

Dzięki tak też zrobiłem myślałem, że można innaczej.
Wiem że zmienna zawiera określoną ilość miejsca w rejestrze i nie można tego zmienić.
Nie zajmuje więcej czasu.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 lis 2012, o 17:09 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 13 paź 2011
Posty: 581
Pomógł: 17

A to może ja się jeszcze dołączę.
Jak wiadomo char oraz uint8_t jest 8biotwa I przyjmuje wartości(0-255)

Jeśli robimy np. jakąś tablicę np. z dniami tygodnia
To używamy char nazwatablicy
A nie uint8_t

Czy to ma jakieś znaczenie, czy użyje się char czy uint8_t ?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 lis 2012, o 17:18 

Pomógł: 0

Możesz przecież zadeklarować swój własny typ do tego, wyliczeniowy. Np. miejsce w tablicy połączone z typem wyliczeniowym i masz problem rozwiązany. Czy char, czy uint8_t to już zależy czy chcesz trzymać w tablicy nazwy dni, miesięcy itd. czy np. stałe które definiują miejsce w tablicy umieszczonej w progmem.
Ewentualnie od razu wrzucasz tablicę z nazwami dni, a potem odwołujesz się do nich przez typ wyliczeniowy. Wtedy tablica jest złożona z znaków czyli typów char.



Góra
  
cytowanie selektywne  Cytuj  
PostNapisane: 25 lis 2012, o 18:12 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 13 paź 2011
Posty: 581
Pomógł: 17

GwynBleidD napisał(a):
W teorii char i uint8_t na AVRach to to samo, ale w praktyce jest pewna konwencja, że w char trzyma się wartości znakowe (czyli napisy różne), a w uint8_t liczbowe. Dzięki temu wiadomo na pierwszy rzut oka jakie zadanie ma dana zmienna, dodatkowo wiele funkcji właśnie ma określony odpowiedni z tych typów na wejściu, więc nie trzeba rzutować.

Teraz jaśniej?

Czyli nie ma ŻADNEJ różnicy między char a uint8_t?

Jednynie informacja dla mnie że w char powinien być znak?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 lis 2012, o 18:29 
Offline
Moderator
Avatar użytkownika

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

GwynBleidD napisał(a):
W teorii char i uint8_t na AVRach to to samo, ale w praktyce jest pewna konwencja, że w char trzyma się wartości znakowe (czyli napisy różne), a w uint8_t liczbowe.


xarmex - jak widzisz - JEST różnica, a tą różnicą jest właśnie ta KONWENCJA, zasada czy jak ją zwał. Wbrew pozorom w programowaniu w C takie rzeczy są istotne dla poprawnego pisania kodu. A w skrócie można powiedzieć, że typ uint8_t powstaje tak:

typedef uint8_t unsigned char

rozumiesz ? czyli z punktu widzenia fizycznych operacji na tych dwóch TYPACH nie ma żadnych różnic, ale konwencja i umowne stosowanie ich we właściwych przypadkach jest pożądane, a przez tak wielu (sorry za brzydkie słowo) olewane :(

np jaki typ wstawiłbyś w miejsce XXX, char czy uint8_t ?

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


a tutaj:

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


jeśli poprawnie odpowiesz na te dwa pytania to zrozumiałeś ;) jak nie to pytaj dalej ;)

_________________
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: 25 lis 2012, o 18:38 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 13 paź 2011
Posty: 581
Pomógł: 17

Nie no pewnie że rozumiem..
pierwszy przypadek uint8_t a drugi char..

Najbardziej pomogło mi to:
typedef uint8_t unsigned char

Dzięki za wyjaśnienie ;)



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: 10 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 2 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:  
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO