incompatible pointer type

Gast #1140407
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
[...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
> 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
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

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.