Forum: PC-Programmierung Struktur in C


von Da Mo (Gast)


Lesenswert?

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!

von TestX .. (xaos)


Lesenswert?

struct x{
  uint8_t a;
  uint8_t b[100];
}


x myvar;
myvar.b[0] = 123;

von Da Mo (Gast)


Lesenswert?

Kann man alle Felder in einem "Durchgang" füllen(du hast nur das Feld 0 
gefüllt)?

von Noname (Gast)


Lesenswert?

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

von Da Mo (Gast)


Lesenswert?

Ich möchte folgende Werte an das Array bildpunkte in der 
Strukturvariablen bilddaten übergeben!?

10, 20, 30, 40, 50 //???
1
struct BILDDATEN
2
{
3
 unsigned char hoehe;
4
 unsigned char breite;
5
 unsigned char bildpunkte[5]; //???
6
};
7
8
int main()
9
{
10
 struct BILDDATEN bilddaten;
11
 
12
 bilddaten.hoehe = 10;
13
 bilddaten.breite = 5;
14
 bilddaten.bildpunkte[0] = 10; //???
15
 
16
 system("pause");
17
 return 0;
18
}

von Troll (Gast)


Lesenswert?

>unsigned char bildpunkte[5]; //???
passt

>bilddaten.bildpunkte[0] = 10; //???
bilddaten.bildpunkte[1] = 20;
bilddaten.bildpunkte[2] = 30;
usw

von Troll (Gast)


Lesenswert?

Den Namen der Struktur würde ich übrigens nicht in Großbuchstaben 
schreiben, diese sind idR für Präprozessorkram reserviert.

von Da Mo (Gast)


Lesenswert?

Troll schrieb:
>>unsigned char bildpunkte[5]; //???
> passt
>
>>bilddaten.bildpunkte[0] = 10; //???
> bilddaten.bildpunkte[1] = 20;
> bilddaten.bildpunkte[2] = 30;
> usw

Geht das nicht einfacher?

von DirkB (Gast)


Lesenswert?

Nur bei der Definition der Variablen.
Es gibt wohl auch eine Erweiterung vom gcc die das macht.
Ist dann aber nicht mehr Standard.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Mit einer Initialisierung sollte das eigentlich so gehen:
1
struct BILDDATEN bilddaten = { 10, 5, { 10, 20, 30, 40, 50 } };

von Da Mo (Gast)


Lesenswert?

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!

von Rolf M. (rmagnus)


Lesenswert?

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:
1
struct BILDDATEN bilddaten =
2
{
3
  .hoehe = 10,
4
  .breite = 5,
5
  .bildpunkte = { 10, 20, 30, 40, 50 }
6
};
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.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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.

von fer t. (Gast)


Lesenswert?

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

von Rolf Magnus (Gast)


Lesenswert?

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.

von Vlad T. (vlad_tepesch)


Lesenswert?

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?

von Vlad T. (vlad_tepesch)


Lesenswert?

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.

von Klaus W. (mfgkw)


Lesenswert?

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.

von Rolf Magnus (Gast)


Lesenswert?

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.

von Rolf Magnus (Gast)


Lesenswert?

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?

von Klaus W. (mfgkw)


Lesenswert?

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:
1
user@ubuntu:~$ nl t.c
2
     1  #include <stdlib.h>
3
     2  #include <stdio.h>
4
     3  
5
     4  
6
     5  int main()
7
     6  {
8
     7      struct 
9
     8      {
10
     9          int      i;
11
    10          unsigned u;
12
    11          char     c[2];
13
    12      } strusi = { 0 };
14
    13  
15
    14      return 0;
16
    15  }
17
user@ubuntu:~$ gcc -Wall -Wextra t.c
18
t.c: In function ‘main’:
19
t.c:12: warning: missing initializer
20
t.c:12: warning: (near initialization for ‘strusi.u’)
21
t.c:12: warning: unused variable ‘strusi’

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

von Rolf Magnus (Gast)


Lesenswert?

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.

von Klaus W. (mfgkw)


Lesenswert?

ja klar, alles mit 0 ist ziemlich deutlich.
Da ich aber gern mit -Wextra arbeite, mache ich es eben nicht.

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.