incompatible pointer type

Gast #1140407
Lesenswert?

Hallo,
mein avrgcc ärgert mich bei dem code:
1
unsigned long temp=123;
2
unsigned char *p=&temp;

immer mit dieser Fehlermeldung (Zeile 2):
1
warning: initialization from incompatible pointer type

funktionieren tut das ganze allerdings einwandfrei, weil ich auf die 
einzelnen bytes der long-variable zugreifen will, nur die Warnmeldung 
nervt.
Wie krieg ich den Fehler weg..?

mfg
Martin

ps: hab bereits die Suche bemüht, allerdings ohne hilfreiches Ergebnis^^
#1140419
Lesenswert?

[...snip cast...]

oder du packst die long-variable in ein union-struct mit ein paar chars, 
dann kannst du ohne pointer zu verbiegen auf die einzelnen bytes 
zugreifen.

noch eine möglichkeit ist die verwendung von bit-operationen, damit 
sparst du auch die pointer-biegerei.

und noch ein tip zum schluss:
in der stdint.h gibt es datentypen mit vorgegebener größe (z.b. 2-byte 
int, 4-byte int, ...). diese funktionieren gleich wie die normalen, 
heißen aber ein bisschen anders:
uint8_t, int64_t, ...
Gast #1140884
Lesenswert?

> Mit einem Cast.
und wie caste ich richtig..?

> oder du packst die long-variable in ein union-struct mit ein paar chars ...
es sollte halt möglichst schnell laufen, deshalb dachte ich direkter 
zugriff über pointer is am besten.

> in der stdint.h gibt es datentypen mit vorgegebener größe
sind das nicht einfach redirects auf die "standard" typen?
#1140926
Lesenswert?

xeox wrote:
>> Mit einem Cast.
> und wie caste ich richtig..?

ohne test:
1
unsigned long temp=123;
2
unsigned char *p=(unsigned char*) &temp;

>
>> oder du packst die long-variable in ein union-struct mit ein paar chars ...
> es sollte halt möglichst schnell laufen, deshalb dachte ich direkter
> zugriff über pointer is am besten.

um die geschwindigkeit zu vergleichen hilft wohl nur ein blick in den 
generierten assembler-code und ein vergleich verschiedener 
implementierungen.
[EDIT]
wie lothar schon sagte, sind 32bit-vars auf einem 8-bit-system richtig 
lahm.
also wenn irgendwie möglich weg damit
[/EDIT]

>
>> in der stdint.h gibt es datentypen mit vorgegebener größe
> sind das nicht einfach redirects auf die "standard" typen?
meistens schon (typdefs, nicht redirects), und die geschwindigkeit 
dürfte eigentlich die gleiche sein.
ich persönlich finde uint8_t für einen 8-bit-integer "schöner" als char 
;-)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren