Struktur in Struktur (c)

Gast #4883811
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
Gast #4883815
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.
Gast #4883821
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?
Gast #4883935
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.
Gast #4883971
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,
Gast #4884046
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.
#4884633
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
}
#4884758
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
}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren