Forum: PC-Programmierung Struktur in Struktur (c)


von Peter (Gast)


Lesenswert?

Hey Leute,
ich möchte mal wissen, wie ich eine struktur in einer Struktur 
programmiere.
Meine Idee wäre folgende:
1
struct NAM{
2
int ID;
3
char Name[20];
4
};
5
6
struct PERS{
7
char Adresse[20];
8
Nam NameID;
9
};

oder muss ich:
1
typedef struct{
2
int ID;
3
char Name[20];
4
}NAM;
5
6
typedef struct{
7
char Adresse[20];
8
Nam NameID;
9
}PERS;
10
11
schreiben?
12
13
Grüße

von ui (Gast)


Lesenswert?

Schonmal versucht das erste zu kompilieren? Das geht gar nicht, weil die 
struct zwar bekannt ist, aber Nam ein unbekannter Bezeichner ist.

Du musst das ganze so schreiben, dass es das ausdruckt, was du damit 
ausdrücken möchtest. Das untere geht zwar prinzipiell, mein gcc mekkert 
aber wegen dem blöden Bezeichner NAM. wenn ichs das in myname umbenne, 
dann gehts.

von Nase (Gast)


Lesenswert?

Peter schrieb:
> Meine Idee wäre folgende:

Meine Idee wäre, ein beliebies Buch über C zu lesen.

von Peter (Gast)


Lesenswert?

1
int main()
2
{
3
  typedef struct{
4
    float x;
5
    float y;
6
  }KOO;
7
8
  typedef struct{
9
    char rot[5];
10
    char grün[5];
11
    char blau[5];
12
  }FRB;
13
14
  struct Alles{
15
    struct FRB;
16
    struct KOO;
17
    char etc[30];
18
  };
19
}

so mecker mein Compiler nicht, kann ich das so machen?

von ui (Gast)


Lesenswert?

Peter schrieb:
> so mecker mein Compiler nicht, kann ich das so machen?

immer wenn der Compiler nicht meckert, kann man das so machen.
Da keiner weiß was du willst, wirds schon passen.

Nase schrieb:
> Meine Idee wäre, ein beliebies Buch über C zu lesen.

Ja

von Andre R. (physicist)


Lesenswert?

Ich würde vernünftige Feldbezeichner empfehlen, u.a. den Verzicht auf 
Umlaute im Quelltext.

von imonbln (Gast)


Lesenswert?

Peter schrieb:
> so mecker mein Compiler nicht, kann ich das so machen?


bla.c: In Funktion »main«:
bla.c:15:13: Warnung: Deklaration deklariert nichts
   struct FRB;
             ^
bla.c:16:13: Warnung: Deklaration deklariert nichts
   struct KOO;
             ^

Dann Solltest du den Compiler Wechseln, oder besser parametrieren. Wie 
auch immer, Dein Code macht nicht das was du erwartest, ich würde Dir 
wirklich eine Buch zum Thema C ans Herz legen, oder wenigstens ein 
Oneline tutorial zum thema struct und C, das sind basics.

Außerdem, um das für und wider des typedef bei structs werden auch gerne 
Flamewars geführt. Im Augenblick würde ich Dir zu Lernzwecken raten das 
typedef zu vergessen und die Aufgabe ohne lösen.

Außerdem kann ich dir nur dringend empfehlen alles was nicht in 7 Bit 
ASCII passt (zum Beispiel Umlaute wie in grün) nicht als Variablen 
Bezeichner zu verwenden. Es sollte zwar gehen (TM), aber gerade bei 
älteren System fällt dir so was schnell auf die Füße daher besser nicht 
machen.

von nicht"Gast" (Gast)


Lesenswert?

@Peter

Damig, jetzt hab ich meinen Kaffee geholt und wollte gerade eine Antwort 
schreiben und dann kommst du daher und nimmst mir die Worte aus dem Mund 
:)

Richtig sollte das so aussehen:
1
  struct KOO{
2
    float x;
3
    float y;
4
  };
5
6
  struct FRB{
7
    char rot[5];
8
    char grün[5];
9
    char blau[5];
10
  };
11
12
  struct Alles{
13
    struct FRB frb;
14
    struct KOO koo;
15
    char etc[30];
16
  };

imonbln schrieb:
> Außerdem, um das für und wider des typedef bei structs werden auch gerne
> Flamewars geführt. Im Augenblick würde ich Dir zu Lernzwecken raten das
> typedef zu vergessen und die Aufgabe ohne lösen.

Bei den Lernzwecken bin ich bei dir. Persönlich mache ich lieber 
typedefs, weil ich das von C++ gewohnt bin und das nicht leiden kann, 
wenn überall das dämliche struct stehen muss.
Wichtig ist vor allem, dass man eine Linie durchzieht und das nicht mal 
mit und mal ohne typedef macht. Der geneigte Leser wird es Danken.

Noch etwas in eigener Sache. Investiere ein wenig Zeit um über sinnvolle 
Namen nachzudenken. Unter KOO kann ich mir gerade nicht wirklich 
zusammenreimen, was das darstellen soll. Anhand der x und y würde ich 
meinen, das sind Koordinaten aber das sollte so in dem Struct Namen 
stehen.

Genau das gleiche bei den Farben. Dort sind sogar Arrays deklariert. Da 
fällt mir gar nichts dazu ein, wofür das benutzt werden könnte. Der Name 
FRB kann für alles stehen.

Und zu guter letzt. Am besten, du gewöhnst dich daran, die Variablen in 
Englisch zu schreiben. Aktuell sind in deiner Programmierweise drei 
Sprachen vorhanden. C, Englisch und Deutsch. Das macht die Sache unnötig 
kompliziert, weil du in drei Sprachen denken musst. Da du um Englisch eh 
nicht drum rum kommst ( weil C sich nun mal in Englisch ausdrückt) 
solltest du auch auf Englisch umsteigen. Glaub mir der Code wird 
lesbarer.


Grüße,

von A. S. (Gast)


Lesenswert?

Peter schrieb:

im ersten Beispiel musst Du struct voranstellen. Und 
groß/kleinschreibung beachten!

struct NAM NameID;

ist halt so in C. In Deinem zweiten Beispiel wird das struct zwar nicht 
benamt, aber per typedef zu dem (eigenständigen) Typen NAM. Auch hier 
gro/kleinschreibung beachten.

Von daher gehen beide Beispiele.

von Armin S. (knall_e)


Lesenswert?

Wenn du mit Typedef struct arbeiten willst (was ich im uebrigen sehr 
gerne tue), dann koennte das so aussehen:
1
int main()
2
{
3
  typedef struct 
4
  {
5
    float x;
6
    float y;
7
  } CoordinatesType;
8
9
  typedef struct 
10
  {
11
    char red[5];
12
    char green[7];
13
    char blue[5];
14
  } ColorType;
15
16
  struct ModuleData 
17
  {
18
    CoordinatesType Coordinates;
19
    ColorType Color;
20
    char misc[30];
21
  };
22
}

von Eric B. (beric)


Lesenswert?

Besser noch die typedefs ausserhalb der Funktion:
1
typedef struct
2
{
3
  float x;
4
  float y;
5
} CoordinatesType;
6
7
typedef struct
8
{
9
  char red[5];
10
  char green[7];
11
  char blue[5];
12
} ColorType;
13
14
struct ModuleData
15
{
16
  CoordinatesType Coordinates;
17
  ColorType Color;
18
  char misc[30];
19
};
20
21
int main()
22
{
23
   ...
24
}

von Armin S. (knall_e)


Lesenswert?

Eric B. schrieb:
> Besser noch die typedefs ausserhalb der Funktion

Natürlich. Eric hat natürlich recht. Hatte ich übersehen :)

von Fabian H. (hdr)


Lesenswert?

Eric B. schrieb:
> typedef struct
> {
>   char red[5];
>   char green[7];
>   char blue[5];
> } ColorType;

Was ist das eigentlich für eine Farbe? 17 Byte pro Farbe kommt mir 
irgendwie merkwürdig vor...

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.