www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik incompatible pointer type


Autor: xeox (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
mein avrgcc ärgert mich bei dem code:
unsigned long temp=123;
unsigned char *p=&temp;

immer mit dieser Fehlermeldung (Zeile 2):
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^^

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Wie krieg ich den Fehler weg..?

Mit einem Cast.

Autor: Daniel F. (df311)
Datum:

Bewertung
0 lesenswert
nicht 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, ...

Autor: xeox (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Daniel F. (df311)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
xeox wrote:
>> Mit einem Cast.
> und wie caste ich richtig..?

ohne test:
unsigned long temp=123;
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 
;-)

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Simon K. wrote:
> Wo steht denn was von AVR?

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

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht 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...)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.