Goto page 1, 2 Next
slawek7
Guest
Mon Jun 27, 2011 7:44 am
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
Waldemar Krzok
Guest
Mon Jun 27, 2011 11:56 am
Am 27.06.2011 07:44, schrieb slawek7:
Quote:
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;
a co w tym takiego dziwnego?
Quote:
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ć?
nie jest
Quote:
nCols = pgm_read_byte(&*pFont);
nRows = pgm_read_byte(&*(pFont + 1)); // tych zapisów nie rozumiem
& oraz *
no to skasuj &*
Quote:
FontTable deklarowane są jako: unsigned char FONT8x16[] PROGMEM =
{.... itd
Oczywiście jest to napisane dla AVR i kompilowane w AVR-GCC
1. NTG
2. Kernighan, Ritchie "Język C"
Waldek
--
My jsme Borgové. Sklopte štíty a vzdejte se. Odpor je marný.
Lelek@
Guest
Mon Jun 27, 2011 2:20 pm
"slawek7" <sholojda@wp.pl> wrote in message
news:bc4df12f-9d57-43ab-b24f-e14cd4b81826@c20g2000vbv.googlegroups.com...
Quote:
int *p=(int *)&w;
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
Lelek@
Guest
Mon Jun 27, 2011 2:24 pm
"Waldemar Krzok" <waldemar@zedat.fu-berlin.de> wrote in message
news:96r9enFv5lU2@mid.uni-berlin.de...
Quote:
1. NTG
2. Kernighan, Ritchie "Język C"
Ty się ciesz, że ktoś pyta o coś takiego zamiast o to jaki telewizor kupić
wszak telewizor to też elektronika
Waldemar Krzok
Guest
Mon Jun 27, 2011 2:41 pm
Am 27.06.2011 16:20, schrieb Lelek@:
Quote:
"slawek7" <sholojda@wp.pl> wrote in message
news:bc4df12f-9d57-43ab-b24f-e14cd4b81826@c20g2000vbv.googlegroups.com...
int *p=(int *)&w;
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
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
--
My jsme Borgové. Sklopte štíty a vzdejte se. Odpor je marný.
Konop
Guest
Mon Jun 27, 2011 3:53 pm
W dniu 2011-06-27 07:44, slawek7 pisze:
Quote:
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:
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ę

..
Quote:
1. int *p=(int *)&w;
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??
Quote:
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ć?
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??
Quote:
nCols = pgm_read_byte(&*pFont);
nRows = pgm_read_byte(&*(pFont + 1)); // tych zapisów nie rozumiem
& oraz *
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... .
Quote:
FontTable deklarowane są jako: unsigned char FONT8x16[] PROGMEM =
{.... itd
Oczywiście jest to napisane dla AVR i kompilowane w AVR-GCC
--
Pozdrawiam
Konop
Michoo
Guest
Mon Jun 27, 2011 5:07 pm
W dniu 27.06.2011 16:41, Waldemar Krzok pisze:
Quote:
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
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*
--
Pozdrawiam
Michoo
Waldemar Krzok
Guest
Mon Jun 27, 2011 8:30 pm
Michoo wrote:
Quote:
W dniu 27.06.2011 16:41, Waldemar Krzok pisze:
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
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*
Dokładnie. (byte *) ma być
Waldek
--
My jsme Borgové. Sklopte štíty a vzdejte se. Odpor je marný.
slawek7
Guest
Thu Jun 30, 2011 12:19 pm
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.
qlphon
Guest
Thu Jun 30, 2011 12:57 pm
Quote:
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.
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
identifikator: 20040501
Guest
Thu Jun 30, 2011 5:15 pm
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
Michoo
Guest
Thu Jun 30, 2011 5:33 pm
W dniu 30.06.2011 19:15, identifikator: 20040501 pisze:
Quote:
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.
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.
--
Pozdrawiam
Michoo
Lelek@
Guest
Fri Jul 01, 2011 2:18 am
"slawek7" <sholojda@wp.pl> wrote in message
news:db2200f0-b9fa-45ae-9717-df333630d799@q15g2000yqk.googlegroups.com...
Quote:
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.
Trzeba ćwiczyć. Gdybys pisał w assemblerze to byś wskaźniki rozumiał
slawek7
Guest
Fri Jul 01, 2011 6:43 pm
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ą.
slawek7
Guest
Fri Jul 01, 2011 7:39 pm
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ą.
Goto page 1, 2 Next