Nicht angemeldet. · Kennwort vergessen · Registrieren

Markus A
Mitglied seit 04/2011
5 Beiträge
Betreff: cast to pointer from integer of different size
der obige Fehler erscheint bei folgendem Code:

  1. uint8_tPORTs[] = { 0x32, 0x35, 0x3B};
  2. (*(volatile uint8_t*)PORTs[0]) |= (1 << 7);
Mit
  1. uint16_t PORTs[] = { 0x32, 0x35, 0x3B};
funktioniert es. Aber 0x32 passt doch in uint8_t.

Kann mir jemand erklären, wo das Problem ist?

Vielen Dank im Vorraus
Dieser Beitrag wurde am 03.08.2011, 00:42 von dom verändert.
Begründung: code tags
sicherha
Informatik-Veteran
Mitglied seit 10/2010
53 Beiträge
Du castest da ein bisschen wild in der Gegend rum. Erschreckenderweise ist der Compiler in Fall 2 still, weil Zeiger 16 Bits lang sind und Warnungen nur bei solchen Casts mit verschieden großen Datentypen ausgespuckt werden. :huh:

PORTs ist ein Array vom Typ uint8_t[]. Element 0 dieses Arrays hat folglich den Typ uint8_t.
Jetzt versuchst du dieses Element (eine Ganzzahl) nach uint8_t * zu casten, also in einen Zeiger - hier rumst es.

Das ist allerdings eh nicht das, was du willst, denn so kann es gar nicht vernünftig funktionieren. In deinem PORTs-Array sollen ja Speicheradressen stehen und keine gewöhnlichen Ganzzahlen. Also muss jedes Element des Arrays ein Zeiger (uint8_t *) sein. Jedes Einzelelement muss dann natürlich bei der Initialisierung gecastet werden.
Das volatile kann man bei der Deklaration gleich mit anbringen, so dass später beim Zugriff auf die Einzelelemente überhaupt kein Cast mehr notwendig ist:
  1. volatile uint8_t *PORTs[] = {(uint8_t *) 0x32, (uint8_t *) 0x35, (uint8_t *) 0x3b};
  2. *PORTs[0] |= (1 << 7);
Markus A
Mitglied seit 04/2011
5 Beiträge
Danke für die schnelle Antwort.
Jetzt versuchst du dieses Element (eine Ganzzahl) nach uint8_t * zu casten
Aber geschieht das nicht auch bei (uint8_t *) 0x32 ?

denn so kann es gar nicht vernünftig funktionieren.
Doch, auf dem Spicboard hats so funktioniert ;-)
sicherha
Informatik-Veteran
Mitglied seit 10/2010
53 Beiträge
Hm, im Prinzip hast du Recht - irgendwo muss hier auf jeden Fall gecastet werden. Bei deiner Variante gibt es aber das Problem, dass alle Adressen vom Compiler in 8-Bit-Werte konvertiert und ins Array gelegt werden. Das geht nur so lange gut, wie alle Adressen <= 0xff sind.

Bei der Lösung, wie ich sie vorgeschlagen habe, hat man dieses Problem nicht. Denn (uint8_t *) 0x32 wird vom Compiler komplett statisch ausgewertet und im Array stehen dann wirklich "echte" Zeiger.

Vielleicht als grundlegende Merkregel:
  • Bei Casts kann man sich ziemlich schnell selber in den Fuß schießen.
  • Casts bei Initialisierungen von Variablen sind weniger problematisch als Casts, die "mitten im Code" stehen.
Schließen Kleiner – Größer + Auf diesen Beitrag antworten:
Prüfcode: VeriCode Gib bitte das Wort aus dem Bild ins folgende Textfeld ein. (Nur die Buchstaben eingeben, Kleinschreibung ist in Ordnung.)
Smileys: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O :troll:
Weitere Zeichen:
Gehe zu Forum
Powered by the Unclassified NewsBoard software, 20110527-dev, © 2003-8 by Yves Goergen