Das leidige modifiable-lvalue-Problem
-
Hallo!
Ich programmiere nicht sonderlich häufig in C, eher in meiner Hiwi-Stelle Embedded C für MSP430.
Ich habe ein wohl recht häufiges Problem, aber die Suchfunktion spuckt kein Ergebnis aus und das was ich zur Fehlerbeschreibung im Netz gefunden habe, trifft auch irgendwie nie darauf zu, was nun mein Problem ist.
Also, ich habe in einer externen Objektdatei eine Funktion, die einen Block von einer Speicherkarte zurück gibt, also ein unsigned-chat-Array.
Die Funktion ist definiert als:
uchar* fMMCReadFromAddress(ulong addr)
(uchar und ulong sind zwei #defines, das habe ich als Abkürzung so umdefiniert)
Im Hauptprogramm habe ich dann ein
uchar buffer[512];
definiert, und ihm die Funktion oben über ein extern-Kommando bekannt gemacht. So weit so gut.
Ich möchte nun was von der Speicherkarte lesen und rufe ein:
buffer=fMMCReadFromAddress(2);
auf. Dies quittiert mir der Compiler aber mit dem Fehler "Expression must be a modifiable lvalue".
Wie schreibe ich das am besten um, wenn ich eine Funktion will, die ein Array zurückgeben soll?
-
Ein uchar* (übrigens solltest du statt #define lieber typedef verwenden, um den zu definieren) ist ein Zeiger auf irgendeinen Speicherbereich, der kann nicht per Zuweisung in ein eigenes char-Array übertragen werden. Dafür gibt es die Funktion strcpy() und Kollegen:
char buffer[512]; strncpy(buffer,fMMCReadFromAddress(2),512);
-
Danke, das macht er. Schmeißt zwar eine Warnung raus, dass unsigned char* inkompatibel mit char* und char const* ist, aber as long as it works
-
Loeckchen schrieb:
Wie schreibe ich das am besten um, wenn ich eine Funktion will, die ein Array zurückgeben soll?
machst du z.b. so deine funktion so:
int fMMCReadFromAddress (ulong addr, uchar *buffer, int buffersize) { // daten in den buffer übertragen // und anzahl übertragener bytes oder status zurückgeben // (z.b. negative werte sind irgendwelche fehler) }
und dann so aufrufen:
uchar buffer[512]; int num; ... num = fMMCReadFromAddress (2, buffer, sizeof(buffer)); if (num < 0) { // fehler auswerten } else { // 0..512 bytes sind im buffer gelandet }
:xmas2:
edit: da war ich ja viiiieeeel zu lahm..
-
Wenn ich die Beschreibung richtig verstehe ist hier ehe memcpy als str*cpy gesucht. Es geht ja um Speicherbloecke, und nicht um nullterminierte Zeichenketten.
-
Genau! Diese Zeile:
memcpy((void *)wbuffer,(const void *)fMMCReadFromAddress(2),512);
funktioniert, ohne irgendwelche Warnungen.
-
Also nach void muss man nicht casten, und nach const schon gar nicht. Das wird implizit gemacht. Die Casts sind daher unnötig.