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


von Peter (Gast)


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

von Andreas K. (a-k)


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) = ...

von Peter (Gast)


Lesenswert?

Oups... Danke!

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

Ich hasse Montag Morgen...   ;o))

von Pete K. (pete77)


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

von Peter (Gast)


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

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.