Forum: Compiler & IDEs C: Array mehrere Zellen beschreiben


von Alex (Gast)


Lesenswert?

Hallo,
ich kann den Zellen eines Arrays bei der Initialisierung Werte zuordnen:
uint array[5] = {1,2,3,4,5};
Gibt es eine einfache Möglichkeit, das Array auch im Programm dann mal 
komplett zu beschreiben???
array[5]= {6,5,3,4,5}; geht nicht.
Danke :-)

von Klaus F. (kfalser)


Lesenswert?

Alex schrieb:
> array[5]= {6,5,3,4,5}; geht nicht.

Nein, gibt es so nicht.

Außerdem :
- Bei
uint array[5] = {1,2,3,4,5};
bedeutet der 5er, dass das Array 5 Elemente groß ist.

Bei
array[5]= xx;
schreibst Du auf Element 5, das es nicht gibt, weil array nur die 
Elemente
0 bis 4 hat.

Glaubst Du nicht, da wäre ein Grund ein Buch über C zu lesen?

von Volker Z. (vza)


Lesenswert?

1
  memset(array,0,sizeof(array));

Oder du schaust in dein C-Buch.

Bitte

von Alex (Gast)


Lesenswert?

@Klaus
Dass ich bei der Initialisierung ein 5 Byte grosses Array erzeugt habe 
ist mit klar, das hättest Du ja z.B. daran sehen können, dass ich auch 
genau 5 (wow!) Zellen mit 5 Werten initialisiere.
Ich weiss auch, dass die letzte Zelle nicht array[5] sondern array[4] 
heisst, aber das ist ja alles nicht mein Problem!

In meinem C-Buch steht nicht, wie ich mehreren Zellen gleichzeitig Werte 
zuordnen kann, so wie es bei der Initialisierung der Fall ist. Steht es 
in Deinem / Weißt Du es? - Dann sag mir bitte, was da steht / wie es 
geht.

@Volker
Danke fuer die Hilfe! - So könnte ich ohne for-Schleife das Array mit 
den gleichen Werten beschreiben, aber ich will ja verschiedene Werte 
drin haben.

@All
nagut, ich habe mich vielleicht doof ausgedrückt. Meine Frage ist:
Ich initialisiere ein Array, schreibe Werte hinein:
uint array[5] = {1,2,3,4,5};
später im Programmablauf will ich die Werte {6,5,3,4,5} in das Array 
schreiben. Das kann ich so machen:
array[0]=6;
array[1]=5;
array[2]=3;
array[3]=4;
array[4]=5;
Aber gibt es dafür eine einfacherer Lösung / Schreibweise?

von Ralf G. (ralg)


Lesenswert?

Alex schrieb:
> später im Programmablauf will ich die Werte {6,5,3,4,5} in das Array
> schreiben
Die Konstanten würde ich in ein eigenes Feld packen und dann mit memcpy 
übernehmen.

von DirkB (Gast)


Lesenswert?

Klaus Falser schrieb:
> Nein, gibt es so nicht.

Wurde schon beantwortet.

von Alex (Gast)


Lesenswert?

Okay. Dann vielen Dank für Eure Mühe und Hilfe!

P.S.: sry fuers angepisst sein, habe gerade nochmal gelesen und 
"array[5]= {6,5,3,4,5}; geht nicht." war wohl der grund fuer den tipp 
mit dem buch.

von Klaus W. (mfgkw)


Lesenswert?

Alex schrieb:
> In meinem C-Buch steht nicht, wie ich mehreren Zellen gleichzeitig Werte
> zuordnen kann, so wie es bei der Initialisierung der Fall ist.

Kein Wunder, weil es in Standard-C ja auch nicht geht.

Der gcc wiederum kann sowas, das ist dann aber nicht mehr portabel.

von Yalu X. (yalu) (Moderator)


Lesenswert?

Alex schrieb:
> array[5]= {6,5,3,4,5}; geht nicht.

Du meinst sicher
1
  array = {6,5,3,4,5};

Aber auch das geht nicht, u.a. deswegen, weil C keine Arrayzuweisungen
erlaubt. Zugewiesen werden können nur einfache Datentypen (wie int,
double, Zeiger usw.), Structs und Unions.

Als Workaround können Arrays aber mit memcpy kopiert werden. In deinem
Fall sähe diese so aus:
1
  memcpy(array, (int []){1, 2, 3, 4, 5}, sizeof array);

Das komische Konstrukt in der Mitte nennt sich offiziell "compound
literal" und wurde im C99-Standard eingeführt. Sehr Alte C-Compiler
unterstützen es möglicherweise nicht. Auch in C++ gibt es das offiziell
(noch) nicht. Kann sein, dass es in C++11 enthalten ist.

von Klaus W. (mfgkw)


Lesenswert?

Yalu X. schrieb:
> ... "compound literal" und wurde im C99-Standard eingeführt.

ja, und zudem kann es der gcc auch in C90 und C++, wenn man es ihm nicht 
per Compileroption verbietet.

http://gcc.gnu.org/onlinedocs/gcc/Compound-Literals.html

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.