Gast
#2720246
Guten Abend, kann ein Strukturtyp auch ein Array enthalten? Wenn ja, wie wird eine Variable von diesem Strukturtyp initialisiert(wie fülle ich das oben angesprochene Array?)? Vielen Dank!
|
Anzeige
|
Struktur in C
Gast
#2720246
Guten Abend, kann ein Strukturtyp auch ein Array enthalten? Wenn ja, wie wird eine Variable von diesem Strukturtyp initialisiert(wie fülle ich das oben angesprochene Array?)? Vielen Dank! struct x{
uint8_t a;
uint8_t b[100];
}
x myvar;
myvar.b[0] = 123;
Gast
#2720256
Kann man alle Felder in einem "Durchgang" füllen(du hast nur das Feld 0 gefüllt)?
Gast
#2720260
Ja, entweder etwas in der Art
memset(myvar, 0, sizeof(myvar));
oder
x myvar = { 0, { 0, 0, 0, 0, 0 } };
(In der zweiten Klammer dann 100 Werte...).
Gast
#2720270
Ich möchte folgende Werte an das Array bildpunkte in der Strukturvariablen bilddaten übergeben!? 10, 20, 30, 40, 50 //???
Gast
#2720274
>unsigned char bildpunkte[5]; //??? passt >bilddaten.bildpunkte[0] = 10; //??? bilddaten.bildpunkte[1] = 20; bilddaten.bildpunkte[2] = 30; usw
Gast
#2720278
Den Namen der Struktur würde ich übrigens nicht in Großbuchstaben schreiben, diese sind idR für Präprozessorkram reserviert.
Gast
#2720305
Troll schrieb: >>unsigned char bildpunkte[5]; //??? > passt > >>bilddaten.bildpunkte[0] = 10; //??? > bilddaten.bildpunkte[1] = 20; > bilddaten.bildpunkte[2] = 30; > usw Geht das nicht einfacher?
Gast
#2720350
Nur bei der Definition der Variablen. Es gibt wohl auch eine Erweiterung vom gcc die das macht. Ist dann aber nicht mehr Standard. Mit einer Initialisierung sollte das eigentlich so gehen:
Gast
#2720407
Rufus Τ. Firefly schrieb: > Mit einer Initialisierung sollte das eigentlich so gehen: > struct BILDDATEN bilddaten = { 10, 5, { 10, 20, 30, 40, 50 } }; Ich bekomme damit eine Fehlermeldung: non-static initialization of a flexible array member Mit static davor geht es! Also bei mir geht das ohne Probleme durch den Compiler. Ich wüßte auch nicht, was daran falsch sein soll oder was mit "a flexible array member" gemeint sein könnte. Rufus Τ. Firefly schrieb: > struct BILDDATEN bilddaten = { 10, 5, { 10, 20, 30, 40, 50 } }; Man kann es auch noch etwas schicker schreiben:
So sieht man gleich, was die einzelnen Zahlen bedeuten, und wenn man mal die Elemente verschiebt oder neue dazwischen einfügt, wird nicht die ganze Initialisierung durcheinandergebracht. Allerdings gibt es einige Compiler, die sich noch immer an der Computer-Steinzeit orientieren und damit nicht klarkommen. Rolf Magnus schrieb: > Allerdings gibt es einige > Compiler, die sich noch immer an der Computer-Steinzeit orientieren und > damit nicht klarkommen. Andersherum formuliert, es gibt nach wie vor nur wenige Compiler, die C99 unterstützen. Als Computer-Steinzeit würde ich allerdings die Zeit vor C89 ansehen, wie sie der "Ur-K&R" beschreibt. Das ist halt die Crux, zwischen Portabilität und Lesbarkeit abzuwägen. Portabilität hier nicht in dem Sinne, daß ein Programm unbedingt auch auf anderen Plattformen/Compilern nutzbar ist, sondern in dem Sinne, daß der vom Programmierer verwendete Programmierstil ihn nicht diesbezüglich einengt.
Gast
#2720589
Da Mo schrieb: > Troll schrieb: >>>bilddaten.bildpunkte[0] = 10; //??? >> bilddaten.bildpunkte[1] = 20; >> bilddaten.bildpunkte[2] = 30; >> usw > > Geht das nicht einfacher? warum nicht einfach eine while oder for schleife? MfG
Gast
#2720656
Rufus Τ. Firefly schrieb: > Rolf Magnus schrieb: >> Allerdings gibt es einige >> Compiler, die sich noch immer an der Computer-Steinzeit orientieren und >> damit nicht klarkommen. > > Andersherum formuliert, es gibt nach wie vor nur wenige Compiler, die > C99 unterstützen. Als Computer-Steinzeit würde ich allerdings die Zeit > vor C89 ansehen, wie sie der "Ur-K&R" beschreibt. C89 ist jetzt 23 Jahre alt. Ok, vielleicht nicht Steinzeit, sondern eher so die Antike… Man beachte auch, daß C89 durch Erscheinen von C99 offiziell für ungültig erklärt wurde. > Das ist halt die Crux, zwischen Portabilität und Lesbarkeit abzuwägen. Portabilität auf Compiler, die es selbst nach 13 Jahren C99 noch nicht geschafft haben, mit der Entwicklung von C aufzuschließen. Von C11 will ich lieber gar nicht erst anfangen. Soll ich da noch 30 Jahre warten, bevor ich das einigemaßen portabel einsetzen kann? Dein Argument verstehe ich schon, ich find's halt nur traurig. Rolf Magnus schrieb: > Portabilität auf Compiler, die es selbst nach 13 Jahren C99 noch nicht > geschafft haben, mit der Entwicklung von C aufzuschließen. Von C11 will > ich lieber gar nicht erst anfangen. Soll ich da noch 30 Jahre warten, > bevor ich das einigemaßen portabel einsetzen kann? > Dein Argument verstehe ich schon, ich find's halt nur traurig. afaik ist auch der gcc nicht feature complete was c99 angeht. gibt es denn überhaupt einen compiler, der dies ist? Noname schrieb: > Ja, entweder etwas in der Art > > memset(myvar, 0, sizeof(myvar)); > > oder > > x myvar = { 0, { 0, 0, 0, 0, 0 } }; > > (In der zweiten Klammer dann 100 Werte...). Komplett mit 0 initialisieren geht übrigends einfacher: x myvar = { 0 }; alle nicht initialisierten Felder werden automatisch auch mit 0 intialisiert. Vlad Tepesch schrieb: > Komplett mit 0 initialisieren geht übrigends einfacher: > x myvar = { 0 }; ja, und sollte (vernünftige Compilereinstellungen vorausgesetzt) zu einer Warnung führen - also nicht unbedingt empfehlenswert.
Gast
#2720857
Vlad Tepesch schrieb: > afaik ist auch der gcc nicht feature complete was c99 angeht. Wenigstens versuchen sie's. Viele andere kümmern sich da gar nicht erst drum und haben's auch nicht vor. Deshalb gibt's dort nichtmal die grundlegendsten C99-Features. > gibt es denn überhaupt einen compiler, der dies ist? Also wenn, dann am ehesten diesen hier: http://www.comeaucomputing.com/ Der gilt sowohl für C, als auch für C++ als die Referenz, wenn's um Konformität geht.
Gast
#2720859
Klaus Wachtler schrieb: > Vlad Tepesch schrieb: >> Komplett mit 0 initialisieren geht übrigends einfacher: >> x myvar = { 0 }; > > ja, und sollte (vernünftige Compilereinstellungen vorausgesetzt) zu > einer Warnung führen Warum? Rolf Magnus schrieb: > Warum? Weil die Werte nur anhand ihrer Position in der Liste (ggf. durch {} untergliedert) den Elementen zugeordnet werden, was immanent fehlerträchtig ist. Wenn dann Werte fehlen, kann es gut daran liegen, daß anders initialisiert wird als man es vielleicht wollte. Der gcc liefert deshalb bei -Wextra in so einem Fall eine Warnung:
Ich kompiliere in der Regel alles mit -Wextra ohne Warnungen, deshalb leiste ich mir keine unvollständigen Initialisierungslisten (wenn schon C; bei C++ sind ja eh Konstruktoren angesagt).
Gast
#2720931
Klaus Wachtler schrieb: > Rolf Magnus schrieb: >> Warum? > > Weil die Werte nur anhand ihrer Position in der Liste (ggf. durch {} > untergliedert) den Elementen zugeordnet werden, was immanent > fehlerträchtig ist. Deshalb finde ich auch die Initialisierung mit Namen wesentlich besser. Aber es ging ja speziell um die Initialisierung von allem mit 0. Da sind Positionen recht egal. ja klar, alles mit 0 ist ziemlich deutlich. Da ich aber gern mit -Wextra arbeite, mache ich es eben nicht. Antwort schreibenBitte melde dich an, um einen Beitrag zu schreiben. |
Anzeige
|