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



Teraz jest 29 mar 2024, o 12:42


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: 27212
Lokalizacja: Szczecin
Pomógł: 1041

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: 27212
Lokalizacja: Szczecin
Pomógł: 1041

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: 27212
Lokalizacja: Szczecin
Pomógł: 1041

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: 27212
Lokalizacja: Szczecin
Pomógł: 1041

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: 27212
Lokalizacja: Szczecin
Pomógł: 1041

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: 27212
Lokalizacja: Szczecin
Pomógł: 1041

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: 27212
Lokalizacja: Szczecin
Pomógł: 1041

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: 27212
Lokalizacja: Szczecin
Pomógł: 1041

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: 27212
Lokalizacja: Szczecin
Pomógł: 1041

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: 27212
Lokalizacja: Szczecin
Pomógł: 1041

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: 27212
Lokalizacja: Szczecin
Pomógł: 1041

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