mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Zuweisungsproblem in c


Autor: sam (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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;
}

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht 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().

Autor: Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: sam (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 );

Autor: peter dannegger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
"char pprelaylist[6][400][1024];"


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

Programmierst Du für Google ne Suchmaschine ?


Peter

Autor: sam (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht 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?

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.