PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : C: "Ungültiger L-Wert in Erhöhung"



SeeksTheMoon
15-01-2007, 11:22
Ich habe hier ein C-Programm vorliegen, das folgendes Konstrukt verwendet:



#define FetchLE32(p) (*((unsigned int*)(p))++)
...

void funktion (int index, unsigned char* start) {
unsigned char* bp;
bp=start+index*8;
offset=FetchLE32(bp);
...
}
Der gcc meckert diese Stelle offset=FetchLE32(bp); an:
"Fehler: Ungültiger L-Wert in Erhöhung"
(bzw. auf englisch, wem das mehr hilft: "error: invalid lvalue in increment")

Ich habe keine Ahnung warum und habe mal folgendes nachgebaut:


#define FetchLE32(p) (*((unsigned int*)(p))++)
int main() {
unsigned int* ptr = (unsigned int*)7;
(*((unsigned int*)(ptr))++);

//FetchLE32(7);
}

Die auskommentierte Zeile macht doch genau das, was die beiden Zeilen darüber machen, aber sobald ich die Kommentare wegnehme, kommt auch hier die Fehlermeldung von oben, während die beiden ersten Zeilen in der main problemlos durchgehen.

Kapier ich jetzt nicht...:(

peschmae
15-01-2007, 12:46
Typproblem!

bp ist ein "unsigned char *". Was dein Makro macht ist:
Deinen unsigned char* nach unsigned int* casten. Wenn du das Resultat davon erhöhen willst muss das ein Lvalue sein. Ist es aber (offenbar) nicht.

d.h. was du machst ist quasi äquivalent zu sowas:


char* b;
(int*)b = 123;


weil du ja erst castest und *dann* das Resultat der inkrementierung an das gecastete Ding zuweiswen willst - und das darfst du nicht.

MfG Peschmä