Forum: Mikrocontroller und Digitale Elektronik incompatible pointer type


von xeox (Gast)


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

von Stefan E. (sternst)


Lesenswert?

> Wie krieg ich den Fehler weg..?

Mit einem Cast.

von Daniel F. (df311)


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

von xeox (Gast)


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?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

xeox wrote:
> es sollte halt möglichst schnell laufen ...
Dann sieh mal, ob du den long los wirst. Ein AVR kann 8 Bit richtig 
schnell, 32 Bit sind wesentlich langsamer.

von Daniel F. (df311)


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

von Simon K. (simon) Benutzerseite


Lesenswert?

Wo steht denn was von AVR?
Ich würde vorsichtig sein, die Union-Variante so vorschnell hier 
herauszuposaunen. Soweit ich weiß, kann die durchaus falsche Ergebnisse 
auf nicht-AVR bzw. nicht-8Bit Plattformen liefern.

von Johannes M. (johnny-m)


Lesenswert?

Simon K. wrote:
> Wo steht denn was von AVR?

xeox wrote:
> mein avrgcc ärgert mich bei dem code:
       ^^^^^^

von Simon K. (simon) Benutzerseite


Lesenswert?

Johannes M. wrote:
> Simon K. wrote:
>> Wo steht denn was von AVR?
>
> xeox wrote:
>> mein avrgcc ärgert mich bei dem code:
>        ^^^^^^

Ah, diese ständige Kleinschreiberei. ;) Bin halt von (durch die 
Forensoftware) automatisch blau markierten Begriffen ausgegangen.

von Johannes M. (johnny-m)


Lesenswert?

Simon K. wrote:
> Ah, diese ständige Kleinschreiberei. ;)
Volle Zustimmung! Das ist echt arm (<== Wobei man genau hier sieht, dass 
die Forensoftware nicht case-sensitiv ist; offensichtlich fehlt da 
oben nur der Bindestrich zum avr-gcc...)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.