Wska?niki i ich rzutowanie (J?zyk C)

Cześć. Chciałbym Was prosić o pomoc w zrozumieniu wskaźników i ich rzutowania. Niby proste, ale jakoś tego nie rozumiem. Jak rozumieć takie zapisy i dlaczego tak jest to pisane:

  1. int *p=(int *)&w;
  2. unsigned int nCols; unsigned int nRows; unsigned char *pFont; unsigned char *pChar; unsigned char *FontTable[] = {(unsigned char *)FONT6x8, (unsigned char *)FONT8x8, (unsigned char *)FONT8x16}; i teraz pFont = (unsigned char *)FontTable[1]; // skoro FontTable[] jest typu unsigned char to po co jeszcze rzutować? nCols = pgm_read_byte(&*pFont); nRows = pgm_read_byte(&*(pFont + 1)); // tych zapisów nie rozumiem & oraz *

FontTable deklarowane są jako: unsigned char FONT8x16[] PROGMEM = {.... itd

Oczywiście jest to napisane dla AVR i kompilowane w AVR-GCC

Reply to
slawek7
Loading thread data ...

Am 27.06.2011 07:44, schrieb slawek7:

a co w tym takiego dziwnego?

nie jest

no to skasuj &*

  1. NTG
  2. Kernighan, Ritchie "Język C"

Waldek

Reply to
Waldemar Krzok

w: .byte 256

ldi XH,high(w) ldi XL,low(w)

Co siedzi w X ? W X siedzi adres początku bufora "w" czyli siedzi tam &w adres początku "w". Jest to liczba w tym X jaka? 2 bajtowa 16 bitowa bo siedzi w XL i XH. Jest to wskaźnik do tego bufora czyli jego adres początkowy.

Teraz jeżeli X i p są tego samego size-u to wystarczy: (int 16 bit) int *p = &w

ale jeśli różnego np long 32 bity unsigned long *p = (unsigned long *)&w

Reply to
rennes

Ty się ciesz, że ktoś pyta o coś takiego zamiast o to jaki telewizor kupić wszak telewizor to też elektronika :-)

Reply to
rennes

Am 27.06.2011 16:20, schrieb Lelek@:

W ogólności nie. Niektóre kompilatory na to nie pozwalają, nawet jak typy mają tą samą wielkość. Jak masz ustawienia typu "paranoic" to nawet coś takiego nie przejdzie:

typedef unsigned char byte; unsigned char C, *pC; byte B, *pB; C = 0x55; pC = &C; pB = pC; // wywala błąd pB = (byte) pC; // jest ok

Waldek

Reply to
Waldemar Krzok

W dniu 2011-06-27 07:44, slawek7 pisze:

Wskaźnik to jest po prostu zmienna (albo stała ;)), która zawiera ADRES jakiejś zmiennej/stałej w pamięci. W sumie adres zmiennej int niczym nie różni się od adresu zmiennej char, ALE - zaraz to wyjaśnię ;)..

Deklarujesz zmienną p, której typ to "wskaźnik na int". Teraz przypisujesz jej wartość równą adresowi zmiennej w (ten & oznacza, że brany pod uwagę jest adres elementu za nim). No i pytanie, jakiego typu jest adres w (&w)? Może to być: wksaźnik na char (char *) wskaźnik na int (int *) i wiele wiele innych - ogólnie to nie wiadomo... dlatego robi się normalne rzutowanie, gdzie typem docelowym jest "wskaźnik na int" (int

*) czyli typ taki, jaki ma zmienna p.

I teraz małe wtrącenie - czym się różni adres zmiennej int od zmiennej np. char? NICZYM!! Ale język C dopuszcza zapisy takie jak na przykład

*(p + 1). W tym kontekscie będzie to wskaźnik na następego inta w pamięci!!! Czyli, w przypadku AVRów, gdzie int ma 16 bitów, jeśli zmienna w jest pod adresem powiedzmy 0x100, to p = 0x100 (p + 1) = 0x102!!!! Gdyby p miało typ char *, to byłoby to 0x100 i 0x101... rozumiesz??

Nie jest typu unsigned char, tylko typu "wskaźnik na unsigned char", moim zdaniem rzutowanie nie jest potrzebne, co nie znaczy, że nie wolno go stosować!!! Może z pewnych względów komuś lepiej było tak zapisać? Albo ktoś uważał, że taki kod jest o wiele czytelniejszy??

Adres elementu wskazywanego przez pFont oraz adres elementu następnego... Moim zdaniem możesz usunąć &* i nic się nie zmieni ;)... Nie potrafię Ci powiedzieć DLACZEGO ktoś zastosował taki zapis, natomiast nie jest on błędny! Jest jednoznaczny, może tylko niepotrzebnie zagmatwany... .

Reply to
Konop

W dniu 27.06.2011 16:41, Waldemar Krzok pisze:

Nie miałeś przypadkiem na myśli pB = (byte*) pC; ? Bo jak kompilator krzyczy na konwersję uchar* -> byte* to na 99% będzie krzyczał na konwersję byte -> uchar*

Reply to
Michoo

Dokładnie. (byte *) ma być

Waldek

Reply to
Waldemar Krzok

Dziękuję za wrozumiałośc i odpowiedz. Swoją drogą zastanawiam sie gdzie tu można się o coś spytać, tak aby dostac odpowiedz a nie ochrzan że się pyta.

Reply to
slawek7

nie bądź naiwny, nawet żona czasami opie..czy jak ją "tylko" o coś zapytasz ;-) nie ma już takich miejsc, gdzie jest zawsze miło i przyjemnie... trzeba po prosu troszkę sobie skórkę pogrubić...

mimo paru najazdów dostałeś ostatecznie kilka bardzo ciekawych odpowiedzi i chyba o to chodziło, prawda? [dawno już nic nie pisałem w C, więc z przyjemnością sobie odświeżyłem pamięć]

na tego typu grupach znajduje się wielu poczciwych grupowiczów, wielu dziwaków (czasami to te same osoby) i zawsze parę oszołomów (mówię ogólnie - nie piję do nikogo konkretnie!) naucz sie z tym żyć i wyławiać treść pośród zgiełku (TG: odfiltrowywać szumy z sygnału ;-) a będziesz z usenetu miał pożytek ...

q
Reply to
qlphon

Dziękuję za wrozumiałośc i odpowiedz. Swoją drogą zastanawiam sie gdzie tu można się o coś spytać, tak aby dostac odpowiedz a nie ochrzan że się pyta.

no na elektrodzie

Reply to
identifikator: 20040501

W dniu 30.06.2011 19:15, identifikator: 20040501 pisze:

Tylko widzisz, tu dostajesz I ochrzan (bo pytania są często na poziomie dna - świadczą albo o skrajnych brakach albo skrajnym lenistwie) I odpowiedzi (bo ludzie jednak Cię pożałują).

Na elektrodzie dostaniesz zjebkę od admina i temat trafi do kosza.

Reply to
Michoo

Trzeba ćwiczyć. Gdybys pisał w assemblerze to byś wskaźniki rozumiał :-)

Reply to
rennes

I dostałem. Na elektrodzie zapytałem o tryb 8 bitowy w LCD od Nokii 6100. temat trafił do kosza a od madrego admina dostałem odpowiedz typu ze temat był poruszany i tam zostało wyjsnione. Gdyby ten pseudo fachowiec (moderator) z elektrody zadał sobie odrobine trudu i przeczytał to do czego link puscił to sam sie powinien do kosza posłać. Dla ciekawości powiem ze odpowiedzią na moje pytanie był link do innego pytania, na które nie było odpowiedzi, ale ten fajchmajster stwierdził ze to jest na tyle wyczerpujące ze grzesze pytają.

Reply to
slawek7

I dostałem. Na elektrodzie zapytałem o tryb 8 bitowy w LCD od Nokii 6100. temat trafił do kosza a od madrego admina dostałem odpowiedz typu ze temat był poruszany i tam zostało wyjsnione. Gdyby ten pseudo fachowiec (moderator) z elektrody zadał sobie odrobine trudu i przeczytał to do czego link puscił to sam sie powinien do kosza posłać. Dla ciekawości powiem ze odpowiedzią na moje pytanie był link do innego pytania, na które nie było odpowiedzi, ale ten fajchmajster stwierdził ze to jest na tyle wyczerpujące ze grzesze pytają.

Reply to
slawek7

In the darkest hour on Thu, 30 Jun 2011 19:15:25 +0200, identifikator: 20040501 snipped-for-privacy@go2.pl screamed:

Jeśli o podstawy to w zasadzie wszędzie się dostanie.

Reply to
Artur M. Piwko

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.