GregorS hat geschrieben:Eieiei ... peinlich ... sowas ...
Macht nichts, wanne's Erklärung ist auch nicht besser.
Es gibt in C (und auch in C++) das "array to pointer decay". Das heißt, man kann ein Array auch als einen Pointer auf das erste Element auffassen.
Code: Alles auswählen
void foo(char * bar) {
printf("%s\n", bar);
}
char hello[] = "Hello"; // hello ist ein char-Array mit 6 Elementen
foo(hello); // ...es kann aber implizit zu char * gecastet werden (das ist der decay)
Und man kann andersrum mittels Pointerarithmetik von einem Pointer aus, auf Arrayelemente zugreifen. Dies ist aber nicht immer eine gute Idee.
Code: Alles auswählen
char c='A';
char *p = &c;
char d;
d = *c; // dies ist äquivalent zu ...
d = c[0]; // ... dem Zugriff auf das erste Array Element
char e = c[1] = *(c+1); // Ist zwar äquivalent, aber trotzdem in dem Fall "undefined behaviour"
Und was ist nun dein Problem? Du würfelst Array und Pointer wild durcheinander.
Code: Alles auswählen
char author_name[]="G. Szaktilla "; // Dies legt tatsächlich ein Array an.
Code: Alles auswählen
struct TGAFile_Header {
...
char author_name[41]; // Allerdings legt dies auch ein Array an *
...
}
Und nun kommt das Problem.
Du versucht hier ein Array einem anderen Array zuzuweisen. Das hat allerdings in C keine Zukunft. Hier hilft auch der "Trick" des Decay's nicht weiter, da ea.author_name ein Array ist, aber der Decay nur für Zuweisungen an Pointer funktioniert. Die Fehlermeldung des Compilers ist also durchaus nachvollziehbar.
invalid array assignment
Du kannst nun entweder TGAFile_Header:: author_name als char * definieren und dann je nach dem z.B. strdup() oder den Decay nutzen und den Pointer direkt zuweisen. Oder du kopierst mit memcopy den Inhalt des Arrays.
Anmerkung: In C++ würde man wohl std::string vorziehen.
* Vergleiche mal sizeof(TGAFile_Header) einmal mit char * und einmal mit char[]