mikrocontroller.net

Forum: Compiler & IDEs Cast to (int *): Was mache ich falsch?


Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wieso geht das nicht, bzw. wieso kriege ich stets die Fehlermeldung
"error: invalid lvalue in assignment"?


void Test(void)
{
  unsigned char MyReg[8];
  int step_count = 4000;
  (int *) (MyReg+2) = step_count;  // error: invalid lvalue in 
assignment
  (int *) &MyReg[2] = step_count;  // error: invalid lvalue in 
assignment
}

Ich verwende AVRGCC 4.1.2

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
(MyReg+2) ist eine Adresse.
(int *) (MyReg+2) ist immer noch eine Adresse.

Da eine Adresse (stark vereinfacht) einer Konstanten entspricht, steht 
da so etwas ähnliches wie
  1 = 2

Gemeint ist wohl
  *(int *)(MyReg+2) = ...

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oups... Danke!

Du hast recht! Das Problem ist tatsächlich, dass ich den ersten Pointer 
* vergessen habe!

Ich hasse Montag Morgen...   ;o))

Autor: Pete K. (pete77)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du nimmst also an, dass das Array fortlaufend im Speicher definiert ist, 
oder ?

Warum willst Du einen int-Wert in einem Char-Array speichern ? Das passt 
nicht so ganz zusammen. Die Definition von int ist von Plattform zu 
Plattform unterschiedlich definiert, d.h. Deine Lösung ergibt einen sehr 
schlecht portierbaren Code.

Ok, ich nehme an, Du brauchst noch 8 Byte Speicher :-)

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Du nimmst also an, dass das Array fortlaufend im Speicher definiert ist,
>oder ?

-Ja-

Ich könnte den MyReg-Block natürlich auch als Struct, statt als Array 
zusammen bauen, das wäre etwas sauberer.

Aber auf den Registerblock wird eh Bytweise als I2C-Bus Registerblock 
von einem anderen Controller aus gelesen und geschrieben...

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.