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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.