Hallo im folgenden ist ein Ausschnitt aus meinem Programm welches mir Probleme bereitet: Bei der letzten Zeile im main() bringt mein Compiler folgende fehlermeldung: "Operands of = have illegal types 'pointer to array 1024 of char' and 'pointer to char'." was muss ich ändern dass es funktioniert? gruss samuel ...... char pprelaylist[6][400][1024]; int relay_index_x; char relay_index_x_char[1024]; int relay_index_y; main() { sprintf(relay_index_x_char,"%d", relay_index_x); (char*)ppspec[8][spec_index_x] = relay_index_x_char; }
In C kann man keine Arrays zuweisen. Entweder du benutzt eine gute alte Schleife um Element für Element zuzuweisen oder du benutzt memcpy().
Man kann aber Pointer benutzen. Dann arbeitet man mit dem "Original". (Pointer sind mir in C auch noch etwas suspekt...) So wie ich den Teilcode oben verstehe, gibt es eine Zahl "relay_index_x", die in einen Text (mit bis zu 1024 Zeichen) ("relay_index_x_char") gewandelt werden soll. Die erzeugte Text soll dann in ein Feld von Texten geschrieben werden. Da man das per Pointer machen könnte (ppspec müsste ein Array aus char* sein), könnte man IMHO sprintf auch gleich den entsprechenden Pointer übergeben. Wenn man nämlich für mehr als einen String relay_index_c_char (quasi als temporäre Variable) benutzt, hat man am Ende ein Feld, dass auf eine einzige Variable zeigt und alle Feldeinträge hätten den gleichen Inhalt.
@sam
Ooops. Hab ich gar nicht geschnallt, dass du da ja mit
Strings arbeitest.
Dann kannst (oder solltest) du auch strcpy benutzen, so wie
man halt in C mit Strings arbeitet.
@Rahul
> ppspec müsste ein Array aus char* sein
Sei vorsichtig. Je nach dem wie du das genau meinst, geht
das ziemlich sicher in die Hose.
Aber im Prinzip hast du schon recht: So wie das da oben
geschrieben ist, ist relay_index_x_char eine ziemlich
überflüssige Variable.
sprintf( ppspec[8][spec_index_x], "%d", relay_index_x );
würde wahrscheinlich das Gewünschte erledigen.
Falls dem OP die Array-Inidzierung im sprintf 'zu heiss'
ist, kann er sie immer noch rausziehen:#
char* tmp = ppspec[8][spec_index_x];
sprintf( tmp, "%d", relay_index_x );
Das schreibt dann auch direkt in das ppspec Array. Allerdings
wird die Adressübergabe an sprintf über einen zwischengeschalteten
Pointer gemacht (den ein guter Optimizing-Compiler sowieso
wieder rausschmeist).
hallo, @ rahul >So wie ich den Teilcode oben verstehe, gibt es eine Zahl >"relay_index_x", die in einen Text (mit bis zu 1024 Zeichen) >("relay_index_x_char") gewandelt werden soll. >Die erzeugte Text soll dann in ein Feld von Texten geschrieben >werden. ja genau das soll der Code erledigen @kbucheg Danke für den Tip. genau das hat mir gefehlt, es funktioniert >sprintf( ppspec[8][spec_index_x], "%d", relay_index_x );
"char pprelaylist[6][400][1024];" Wow, so einfach mal 2,5MB Speicher verschwendet. Programmierst Du für Google ne Suchmaschine ? Peter
grins ne @peter ich speicher in dem feld eine testspezifikation für einen teststand ab. wie kann man es programmieren, dass es weniger Speicher brauch? Kann man es dynamisch machen mit malloc z.B.? samuel
Sicher kann man das dynamisch machen. #define DIMX 20 #define DIMY 400 char* ppspec[DIMX][DIMY]; int relay_index_x; void Init() { int i, j; for( i = 0; i < DIMX; ++i ) for( j = 0; j < DIMY; ++j ) ppspec[i][j] = 0; } void Clean() { int i, j; for( i = 0; i < DIMX; ++i ) for( j = 0; j < DIMY; ++j ) free( ppspec[i][j] ); } int main() { char relay_index_x_char[1024]; char* tmp; /* ** Mal das 2D Array der Pointer auf 0 setzen. ** Ist zwar nicht wirklich notwendig, da es sich hier ** um eine globale Variable handelt und die wird sowieso ** mit 0 initialisiert, was für Pointer eh passt ** aber: wenn das ganze mal voll dynamisch wird, ist man ** um diesen call meist sehr froh */ Init(); /* ** mal den String erzeugen lassen */ sprintf( relay_index_x_char, "%d", relay_index_x ); /* ** dann ein char Array erzeugen, welches den String aufnimmt ** und so gross ist, dass der String grade noch rein geht ** und den String dorthin kopieren */ tmp = malloc( strlen( relay_index_x_char ) + 1 ); strcpy( tmp, relay_index_x_char ); /* ** diesen Pointer jetzt im 2D Array der Pointer ** verankern */ ppspec[8][spec_index_x] = tmp; /* ** Program beenden: ** Zusammenräumen */ Clean(); } Nächste Frage: Was ist mit dem 2D Array selbst. Braucht das wirklich ständig 20 * 400 Einträge? Oder sollte man die nicht auch besser dynamisch je nach Bedarf erzeugen?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.