Forum: Mikrocontroller und Digitale Elektronik Zuweisungsproblem in c


von sam (Gast)


Lesenswert?

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;
}

von Karl heinz B. (kbucheg)


Lesenswert?

In C kann man keine Arrays zuweisen.

Entweder du benutzt eine gute alte Schleife um
Element für Element zuzuweisen oder du benutzt memcpy().

von Rahul (Gast)


Lesenswert?

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.

von Karl heinz B. (kbucheg)


Lesenswert?

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

von sam (Gast)


Lesenswert?

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

von peter dannegger (Gast)


Lesenswert?

"char pprelaylist[6][400][1024];"


Wow, so einfach mal 2,5MB Speicher verschwendet.

Programmierst Du für Google ne Suchmaschine ?


Peter

von sam (Gast)


Lesenswert?

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

von Karl heinz B. (kbucheg)


Lesenswert?

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
Noch kein Account? Hier anmelden.