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 w 2025? 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 mar 2025, o 18:59


    Strefa czasowa: UTC + 1





    Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 31 ]  Przejdź na stronę 1, 2  Następna strona
    Autor Wiadomość
    PostNapisane: 15 paź 2012, o 23:48 
    Offline
    Moderator
    Avatar użytkownika

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

    Jeśli mamy np tablicę:
    Kod:
    uint16_t tab[] = { 520, 129 };

    oraz wskaźnik:
    Kod:
    uint8_t *wsk = tab;

    i zmienną:
    Kod:
    uint8_t a;

    to jeśli zrobimy działanie:
    Kod:
    wsk++;
    a = *wsk;

    to jaka liczba będzie w zmiennej a ?

    [uzupełnienie - załóżmy że bajty w słowach układane są w postaci BIG ENDIAN]

    _________________
    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: 16 paź 2012, o 01:05 
    Offline
    Użytkownik

    Dołączył(a): 29 mar 2012
    Posty: 595
    Lokalizacja: Jaworzno
    Pomógł: 39

    Miejcie koledzy litość. Taki ciekawy temat o tej porze, a ja za dwie godziny do pracy muszę wstać, a jak piszę to chyba jeszcze nie śpię ;). Dzięki jednak za zagadki :D

    _________________
    Pozdrawiam
    PP



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 16 paź 2012, o 08:26 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 29 lis 2011
    Posty: 582
    Lokalizacja: okolice Wrocławia :)
    Pomógł: 24

    Widzę że krzyżówki stały się już przeżytkiem, teraz w modzie są 'wskaźnikówki' :lol:

    _________________
    sig off ;(



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 16 paź 2012, o 08:37 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 17 kwi 2012
    Posty: 195
    Pomógł: 0

    hmmm moim zdaniem 129 chociaż podczas pierwszego przypisania wartość 520 jest za duża aby można było przypisać do wskaźnika ( wskaźnik jest typu uint8_t a tablica uint_16 ) więc podczas pierwszego przypisania uint8_t *wsk = tab; powinno się dokonać niejawne rzutowanie więc 255 ,ale ostateczne rozwiązanie to (po zwiększeniu adresu 0 go elementu o 1) 129



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 16 paź 2012, o 08:43 

    Pomógł: 0

    Jeden :)

    Bo dwu bajtowe zmienne z tablicy rzutowane na uint8, stracą 8pierwszych bitów, przez co, po zwiększeniu wskaźnika zmienna a zostanie załadowana wartością (1)0000001, bez tej jedynki z przodu, przez co wartość a==1

    Jeżeli dotyczyło by to pierwszego elementu tablicy tj. 520 (binarnie 1000001000) do zmiennej a trafiło by 8....



    Ostatnio edytowano 16 paź 2012, o 08:45 przez rezasurmar, łącznie edytowano 1 raz

    Góra
      
    cytowanie selektywne  Cytuj  
    PostNapisane: 16 paź 2012, o 08:45 
    Offline
    Moderator
    Avatar użytkownika

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

    Sonix napisał(a):
    Widzę że krzyżówki stały się już przeżytkiem, teraz w modzie są 'wskaźnikówki' :lol:


    hahaha dobre dobre - wskaźnikówki ;)

    ------------------------ [ Dodano po: 2 minutach ]

    Na razie podpowiem tylko że nie będzie to ani 129 ani 1

    ale mogę podpowiedzieć, że a będzie = 8

    a wy Panowie ( i Panie może) ;) .... myślcie dalej dlaczego 8

    _________________
    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: 16 paź 2012, o 09:15 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 17 kwi 2012
    Posty: 195
    Pomógł: 0

    UAAA widze że idę do konta :(



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 16 paź 2012, o 09:19 
    Offline
    Moderator
    Avatar użytkownika

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

    Nie nie nikt - nie idzie do konta - to jest specjalne bojowe pytanie - i powstało wczoraj w nocy na prośbę kolegi Antystatyczny.

    Ma ono na celu lepsze przybliżenie wskaźników .... na razie rozwiązania nie podaję - czekamy jeszcze na odpowiedź od Antystatycznego ...

    a później jak mówiłem jeśli prawidłowej nie będzie i prawidłowego wytłumaczenia - to pojawi się kolejne pytanie zamiast odpowiedzi - pytanie naprowadzające - uprzedzam ;) może ich być kilka

    więc bardzo ew proszę tych, którzy dobrze wiedzą o co tu chodzi aby dali szansę innym a mi także w celu przeprowadzenia tego po mojemu ok ?

    _________________
    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: 16 paź 2012, o 09:29 
    Offline
    Użytkownik

    Dołączył(a): 10 paź 2012
    Posty: 123
    Pomógł: 10

    Witam.

    mirekk36 napisał(a):
    Jeśli mamy np tablicę:
    Kod:
    uint16_t tab[] = { 520, 129 };

    oraz wskaźnik:


    Kod:
    uint8_t *wsk = tab;



    i zmienną:
    Kod:
    uint8_t a;

    to jeśli zrobimy działanie:
    Kod:
    wsk++;
    a = *wsk;

    to jaka liczba będzie w zmiennej a ?


    Bedzie to młodszy bajt z 2 bajtowej zmiennej 520 ?

    Pozdrawiam
    Jarek



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 16 paź 2012, o 09:35 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 12 lut 2012
    Posty: 243
    Lokalizacja: wlkp
    Pomógł: 2

    Yes :)



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 16 paź 2012, o 09:38 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 17 kwi 2012
    Posty: 195
    Pomógł: 0

    wynikało by z tego co napisał jark że wskażnik najpierw wskazuje na starszy bajt a potem na młodszy - ale wydaje mi się że to chyba nie tak. gdyby było odwrotnie to zgoda



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 16 paź 2012, o 10:17 
    Offline
    Moderator
    Avatar użytkownika

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

    kidcowboy napisał(a):
    wynikało by z tego co napisał jark że wskażnik najpierw wskazuje na starszy bajt a potem na młodszy - ale wydaje mi się że to chyba nie tak. gdyby było odwrotnie to zgoda


    załóżmy że mamy do czynienia z układem bajtów BIG ENDIAN ok ? (oczywiście w AVR GCC jest LITTLE ENDIAN .... ale przy okazji kilka osób zrozumie te dziwne określenia BIG i LITTLE ENDIAN ;) )

    _________________
    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: 16 paź 2012, o 10:58 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 06 maja 2012
    Posty: 233
    Lokalizacja: Gdynia
    Pomógł: 15

    Kod:
    uint16_t tab[] = { 520, 129 };
    uint8_t *wsk = tab;


    Wskaźnik wskazuje na tablicę tab a dokładnie na pierwszy bajt tej tablicy czyli uwzględniając układ bajtów Little endian czyli na młodszy bajt liczby 520 (00001000)

    Kod:
    wsk++;


    Wskaźnik zostaje zwiększony o pozycję jednego bajta i wskazuje teraz na starszy bajt liczby 520 (00000010) czyli 2
    No chyba, że kompilator jest mądrzejszy i zrobi to odwrotnie:)



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 16 paź 2012, o 11:05 
    Offline
    Moderator
    Avatar użytkownika

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

    Antystatyczny napisał(a):
    Nie wiem teraz od czego zalezy ułożenie bajtów w słowie, ale to jest pewnie to tajemnicze jak na razie little i big endian


    Trochę może z tym ENDIAN zamieszałem ale przy okazji i tego się dowiesz. Generalnie w AVR GCC obowiązuje LITTLE ENDIAN, czyli jeśli jest np słowo (dwa bajty) to w pamięci przechowywany jest najpierw młodszy bajt a później pod kolejnym adresem starszy bajt, przykład

    jest sobie liczba 0x2308 (hex żeby łatwiej pokazać o co chodzi)

    wiemy że 0x23 to starszy bajt natomiast 0x08 to jej młodszy bajt

    zatem normalnie w AVR GCC w pamięci ułożą się one tak

    0x08 - pierwszy adres w RAM
    0x23 - drugi adres w RAM

    Inaczej jest gdy mówimy o BIG ENDIAN, wtedy w pamięci te same bajty zostaną ułożone tak:

    0x23 - pierwszy adres w RAM
    0x08 - drugi adres w RAM

    mam nadzieję, że teraz jaśniej z tym BIG i LITTLE ENDIAN ?

    wracając do naszego przykładu, mieliśmy liczbę (dziesiętnie) 520 czyli w HEX = 0x0208 ;)

    zakładając więc że mamy do czynienia z BIG ENDIAN to bajty w pamięci RAM naszej tablicy

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


    ułożyłyby się w takiej kolejności - spójrz:

    0x02
    0x08
    0x00
    0x81

    dlatego pisałem że w naszej zmiennej a pojawi się liczba = 8

    Na wszelki wypadek podaję prawidłowe ułożenie bajtów LITTLE ENDIAN jakie miałoby miejsce naprawdę w AVR GCC

    0x08
    0x02
    0x81
    0x00

    a więc w tym przypadku zmienna a byłaby = 2

    ------------------------------------------------------------

    pozostaje teraz kwestia dlaczego tak się dzieje - i o co tu dokładnie chodzi, ale w tym celu kolejna zagadka:

    mamy teraz tablicę:

    Kod:
    uint8_t tab[] = { 8,2,129,0 };


    Następnie powołujemy do życia wskaźnik i zmienną:

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


    ile tym razem będzie wynosiła wartość zmiennej a ?

    ------------------------ [ Dodano po: 6 minutach ]

    Mam nadzieję że ta druga zagadka będzie bardzo ciekawa i gdy omówimy dwie - to nagle wszystko stanie się jasne ;)

    _________________
    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: 16 paź 2012, o 11:13 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 06 maja 2012
    Posty: 233
    Lokalizacja: Gdynia
    Pomógł: 15

    Uwzględniając zapis Little Endian 129.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 16 paź 2012, o 11:15 
    Offline
    Moderator
    Avatar użytkownika

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

    nixie napisał(a):
    Uwzględniając zapis Little Endian 129.


    tak , dokładnie tak uwzględniając LITTLE ENDIAN będzie to 129, a uzwględniając BIG ENDIAN byłoby 33024 ;)

    ale ok - nixie widać że ty się orientujesz - pozwól więc teraz że np kolega Antystatyczny albo Wrangler - spróbują to jakoś swoimi słowami wyjaśnić - nawet jeśli będą jakieś błędy to będziemy to korygować ok?

    _________________
    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: 16 paź 2012, o 11:37 

    Pomógł: 0

    Kurcze nie zauważyłem że wsk wskazuje na uint8 stąd mój błąd w rozumowaniu :).



    Góra
      
    cytowanie selektywne  Cytuj  
    PostNapisane: 16 paź 2012, o 11:38 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 14 lut 2012
    Posty: 598
    Lokalizacja: Warszawa
    Pomógł: 13

    Pomyśl .......... klucz do zrozumienia jest ukryty w rozmiarach zmiennych ;)



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 16 paź 2012, o 11:45 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 01 cze 2012
    Posty: 102
    Pomógł: 2

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



    ech... za długo pisałem ;)

    _________________
    sig off ;(



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 16 paź 2012, o 11:52 
    Offline
    Moderator
    Avatar użytkownika

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

    Malutki_27 napisał(a):
    Pomyśl .......... klucz do zrozumienia jest ukryty w rozmiarach zmiennych ;)


    ja bym powiedział że klucz jest ukryty w typach wskaźników. Zrozumienie tego to jak przekroczenie bariery dźwięku (1 macha) ;) ....

    ale ok małe wyjaśnienie.

    Antystatyczny napisał(a):
    Hmm... ale dlaczego wskazuje na tab[2] skoro adres zwiekszyliśmy tylko o 1?


    otóż fizyczna wartość wskaźnika wsk, zwiększa się nie o 1 w tym przypadku a o 2 dlaczego ?

    ano dlatego że typ wskaźnika jest uint16_t (dwu-elementowy że tak powiem)

    i do takich celów są m.in potrzebne nam TYPY wskaźników ;)

    i teraz kolejny mały już tylko obrazowy przykładzik, gdyby była tablica:

    Kod:
    uint8_t tab[] = { 8,2,129,0,24,0,0,0 };


    a powołalibyśmy wskaźnik tym razem 32 bitowy

    Kod:
    uint32_t *wsk;

    wsk++;

    a = *wsk;


    to już chyba się domyślasz, że wartość w a byłaby równa 24 (w LITTLE ENDIAN) ?

    zobacz jeszcze raz - dzięki 32-bitowemu typowi wskaźnika - nagle tablica byłaby widoczna z jego punktu widzenia tak

    {
    Kod:
     8,2,129,0,  24,0,0,0 };


    natomiast

    Kod:
    wsk++;


    spowodowałoby zwiększenie adresu wskaźnika już nie o 2 ale o 4 ponieważ jego typ jest 4-bajtowy

    Jak widać dzięki temu i dzięki wskaźnikom można się dobierać do dowolnej części pamięci w prawie nieograniczony sposób

    _________________
    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: 16 paź 2012, o 11:53 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 14 lut 2012
    Posty: 598
    Lokalizacja: Warszawa
    Pomógł: 13

    Dobrze kombinujesz ;)

    |_8_bit_|_8_bit_|_8_bit_|_8_bit_| <- tablica
    |____16_bit___.|_____16 bit___.| <- wskaźnik

    Dodatkowo spojrzyj na opis zapisu umieszczony przez Mirka i powinno byc już jasne jaka będzie wartość ;)


    hihiiii i Mirek był pierwszy ;)

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

    I nie wyszedł obrazek który by mógl rozjaśnić :(



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 16 paź 2012, o 11:57 
    Offline
    Moderator
    Avatar użytkownika

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

    Antystatyczny napisał(a):
    Wskaźnik jest 16 bitowy, bo i tak zawsze jest 16 bitowy w przypadku pamieci o rozmiarze do 64kB. .


    i to właśnie powoduje największe nieporozumienia. Pewnie że wskaźnik jest 16-bitowy - ale ....

    ale TYP wskaźnika nie ma nic wspólnego z tym że jest on 16-bitowy.

    TYP WSKAŹNIKA mówi nam o tym - na ilo-bajtowy element on wskazuje

    i dokładnie tak będzie działała arytmetyka wskaźnika

    czyli dla

    Kod:
    char * wsk;

    wsk++;


    spowoduje wskazanie na kolejny adres w pamięci RAM. Na kolejną komórkę (bo pamięć RAM ma tu organizację 8-bitową)

    ale dla

    Kod:
    uint16_t *wsk;

    wsk++;


    spowoduje wskazanie o dwa bajty dalej w stosunku do pierwszego adresu elementu tablicy.

    za to:

    Kod:
    uint32_t *wsk;

    wsk++;


    zwiększy adres w RAM aż o 4 bajty do przodu. Czyli jak widzisz jeśli chodzi o arytmetykę wskaźników to niezawsze

    1+1 = 2 z punktu widzenia fizycznych adresów w pamięci RAM - to będzie prawda tylko dla tych przypadków gdy typ wskaźnika będzie 1-bajtowy, np: char, uint8_t, int8_t

    ------------------------ [ Dodano po: 2 minutach ]

    Antystatyczny napisał(a):
    Czyli zmienna wskaźnikowa nie zawsze jest 16bitowa? Jeśli nie, to jak np. w 8 bitowej przechować 16bitowy adres zmiennej? (Chyba czegoś tu nie zauważam i stąd błędy w moim toku myślenia)


    spójrz co napisałem do ciebie wyżej.

    ZMIENNA wskaźnikowa ZAWSZE jest 16-bitowa. Ale to odnosi się do adresu w pamieci RAM. A trzeba przecież jeszcze określić jakoś na jaki element wskazuje tenże 16-bitowy wskaźnik i dlatego ustalamy typ wskaźnika. Jak widzisz z powyższego może on wskazywać na elementy 8-bitowe ale i na większe czyli 16-bitowe, 32-bitowe a nawet 64-bitowe ;)

    i wtedy inaczej działa arytmetyka wskaźnika

    _________________
    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: 16 paź 2012, o 12:06 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 17 kwi 2012
    Posty: 195
    Pomógł: 0

    i teraz kolejny mały już tylko obrazowy przykładzik, gdyby była tablica:

    Kod:
    uint8_t tab[] = { 8,2,129,0,24,0,0,0 };


    a powołalibyśmy wskaźnik tym razem 32 bitowy

    Kod:
    uint32_t *wsk;

    wsk++;

    a = *wsk;


    to już chyba się domyślasz, że wartość w a byłaby równa 24 (w LITTLE ENDIAN) ?

    zobacz jeszcze raz - dzięki 32-bitowemu typowi wskaźnika - nagle tablica byłaby widoczna z jego punktu widzenia tak

    {
    Kod:
     8,2,129,0,  24,0,0,0 };


    natomiast

    Kod:
    wsk++;



    Czyli w Big Endian byłoby 0 ?



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 16 paź 2012, o 12:08 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 06 maja 2012
    Posty: 233
    Lokalizacja: Gdynia
    Pomógł: 15

    mirekk36 napisał(a):
    ale ok - nixie widać że ty się orientujesz - pozwól więc teraz że np kolega Antystatyczny albo Wrangler - spróbują to jakoś swoimi słowami wyjaśnić - nawet jeśli będą jakieś błędy to będziemy to korygować ok?


    Ok, ale przyznam szczerze, że czasami czuję się zakręcony jak słoik z tymi wskaźnikami. Jako ciekawostka etymologia zwrotów Little i Big Endian z wiki.

    Cytuj:
    Angielskie nazwy big endian i little endian pochodzą z książki Jonathana Swifta Podróże Guliwera i odnoszą się do mieszkańców Liliputu, których spór o to, czy ugotowane jajko należy tłuc od grubego (tępego), czy od cienkiego (ostrego) końca, doprowadził do podziału na dwa stronnictwa toczące ze sobą niekończące się, choć bezsensowne dysputy i wojny.



    Ostatnio edytowano 16 paź 2012, o 12:10 przez nixie, łącznie edytowano 1 raz

    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 16 paź 2012, o 12:09 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 17 kwi 2012
    Posty: 195
    Pomógł: 0

    A kiedy stosuje się BIG ENDIAN ?? A tak poza tym to dobra wskaźnikówka



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 16 paź 2012, o 12:10 
    Offline
    Moderator
    Avatar użytkownika

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

    kidcowboy napisał(a):
    Czyli w Big Endian byłoby 0 ?


    jak?

    24,0,0,0

    więc skoro najstarszy bajt w BIG ENDIAN jest = 0 a mamy tu reprezentację 32-bitową to wartość byłaby: 402.653.184 ;)

    ------------------------ [ Dodano po: 2 minutach ]

    Kiedy się stosuje BIG ENDIAN .... hmmm w AVR GCC nigdy - ale jeśli np będziesz miał analizować jakieś zapisy w pliku, gdzie np ktoś inny albo inny kompilator zapisał coś w BIG ENDIAN - to co ? ;) to wtedy warto wiedzieć o co chodzi... W takim przypadku będziesz musiał umieć sobie zamienić np BIG na LITTLE albo odwrotnie jeśli będziesz chciał z poziomu AVR zapisać taki plik WAV na kartę. A robię to np przecież w tym plaeyrku - recorderku, który z mikrofonu od razu nagrywa dźwięki wprost i pięknie do plików WAV

    http://atnel.pl/avr-wav-player-recorder.html

    Obrazek


    proszę bardzo np w drugiej książce opisuję strukturę nagłówka pliku dźwiękowego WAV, którego odczytujemy z karty pamięci SD. A tam mamy zapisy pewnych wartości zarówno w LITTLE ENDIAN oraz BIG ENDIAN. Więc przydaje się ta wiedza - prawda ..... (a to tylko taki drobny ale za to namacalny i rzeczywisty przykład)

    _________________
    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: 16 paź 2012, o 12:26 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 01 cze 2012
    Posty: 102
    Pomógł: 2

    W przypadku typów 8-bitowych nie ma sensu mówić o Little albo Big Endian.

    _________________
    sig off ;(



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 16 paź 2012, o 12:28 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 17 kwi 2012
    Posty: 195
    Pomógł: 0

    hehehe . Czyli powracając do pierwszego przykładu - zagadki. Wskaźnik i tak zajmuje dwie komórki pamięci ale zapis:
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

    powoduje - wyłuskanie wartości spod pierwszej (młodszej części bajtu) bo tyle jest w stanie przechować. jakby było
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

    to by wskazał całą liczbę 520 (0x0208)



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 16 paź 2012, o 12:40 
    Offline
    Moderator
    Avatar użytkownika

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

    kidcowboy napisał(a):
    to by wskazał całą liczbę 520 (0x0208)


    DOKŁADNIUŚKO TAK ;) o to chodzi - bardzo dobrze to wytłumaczyłeś teraz i widać że dobrze rozumiesz...

    teraz tylko w praktyce jak najszybciej to trzeba ćwiczyć


    ja na tym etapie wyjaśnię oczywiście jeszcze jeden podstęp którego użyłem, otóż specjalnie nie zastosowałem jawnego rzutowania, a tymczasem kompilator na taki kod burzyłby się i sypnął warnigami. Ale też to byłaby za duża podpowiedź.

    otóż trzeba byłoby to zrobić tak np:

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


    a w przypadku pierwszym:

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


    widzicie teraz jawne rzutowania - teraz kompilator nie będzie krzyczał ponieważ wyraźnie mu mówimy - eeeej ty, panie końpilator potraktuj mnie tą tablicę jako zbiór elementów x-bajtowych ;)

    _________________
    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: 16 paź 2012, o 13:56 
    Offline
    Moderator
    Avatar użytkownika

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

    GwynBleidD napisał(a):
    3. Ilość bitów wskaźnika NIE JEST jego rozmiarem zajmowanym w pamięci.


    No tu troszkę ci nie wyszło. Gdybyś napisał tak

    3. Ilość bitów TYPU zmiennej wskaźnikowej NIE JEST jego rozmiarem zajmowanym w pamięci.

    to byłoby lepiej..... Ponieważ ilość bitów wskaźnika (wskaźnik jest 16-bitowy) zawsze spowoduje, że w RAM zostaną zajęte na zmienną wskaźnikową 2 bajty.

    Pozostałe punkty ok.

    _________________
    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: 31 ]  Przejdź na stronę 1, 2  Następna strona

    Strefa czasowa: UTC + 1


    Kto przegląda forum

    Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 0 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