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

KURS HOME ASSISTANT

Chcesz zautomatyzować swój dom bez skomplikowanego kodowania?
Zastanawiasz się nad wyborem sprzętu, oprogramowania i aplikacji?
Od czego zacząć przygodę z HA? Co będzie najlepsze na start?

Nasz kurs Home Assistant nauczy Cię krok po kroku, jak łatwo zautomatyzować swój dom i oszczędzić na rachunkach za prąd i ogrzewanie. Bez chmur, bez zbędnych abonamentów. Twoja przygoda z Home Assistant zaczyna się tutaj!

↓↓↓

    Szanujemy Twoją prywatność. Możesz wypisać się w dowolnym momencie.




    Teraz jest 11 lip 2025, o 14:00


    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: 27415
    Lokalizacja: Szczecin
    Pomógł: 1043

    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: 27415
    Lokalizacja: Szczecin
    Pomógł: 1043

    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: 582
    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: 582
    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: 27415
    Lokalizacja: Szczecin
    Pomógł: 1043

    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: 582
    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