Forum: PC-Programmierung ANSI-C typedef Problem


von Michael L. (nemesisod)


Lesenswert?

Hallo zusammen,

ich habe ein kleines Problem welches ich nicht wirklich gelöst bekomme.

Ich habe vor eine Datei nach bestimmten Zeilen zufiltern,
eine bestimmte Zeile (sog. G-Code) kann (muss aber nicht) einen Block 
öffnen welchem mehrere Zeilen Daten-Code folgen. Es kann aber auch 
vorkommen das wiederum in diesem Block ein neuer G-Code steht und wieder 
ein Block geöffnet wird.

Ich will nun diese Struktur in einer Linearen Liste ermitteln. Das 
erkennen der Blöcke ist auch kein Prob. Doch habe ich ein kleines 
Problem beim erstellen der Typen für die Lineare Liste.

Hier mal mein Code:
1
typedef struct Block
2
{
3
   union u_tag
4
   {
5
    G_CODE  G;                          
6
    DATA_BLOCK data;                         
7
   } u;
8
   struct Block *next;     
9
} DATA_LIST;
10
11
typedef struct ko
12
        { 
13
          unsigned int X;               // X-Koordinate
14
          unsigned int Y;               // Y-Koordinate
15
          unsigned int PLOT_FUNCTION;   // D-Code
16
        } DATA_BLOCK;
17
        
18
typedef struct GC
19
        {
20
          unsigned int G;               // G-Code
21
          unsigned int X;               // X-Koordinate (Optional)
22
          unsigned int Y;               // Y-Koordinate (Optional)
23
          unsigned int D;               // D-Code (Optional)
24
          DATA_LIST *Block_Liste;       
25
        } G_CODE;

So, der Compiler gibt jetzt einen Fehler aus, weil zum Zeitpunkt der 
definition von DATA_LIST G_CODE noch nicht definiert ist. Vertauschen 
kann ich es aber auch nicht, dann wäre zum Zeitpunkt der definition von 
G_CODE DATA_LIST noch nicht definiert.

Bei Funktionen kann man das ja durch einmaliges bennennen am Anfang der 
Datei bekanntmachen, aber bei typedef hat es nicht funktioniert.

Wäre froh wenn mir jemand helfen könnte.

Gruß
NemesisoD

von Michael A. (micha54)


Lesenswert?

Hallo,

Du kannst in C wohl nur Pointer vorwärts deklarieren, also muss 
DATA_LIST nach hinten und DATA_LIST * vorab als erstes definiert werden.

Sollte klappen, denn das Problem ist bei allen verketteten Listen das 
gleiche.....

Gruss,
Michael

von Michael L. (nemesisod)


Lesenswert?

Hallo Michael,

danke erstmal für deine schnelle Antwort,
ich habe es nun umgestellt :
1
typedef struct GC
2
{
3
    unsigned int G;               // G-Code
4
    unsigned int X;               // X-Koordinate (Optional)
5
    unsigned int Y;               // Y-Koordinate (Optional)
6
    unsigned int D;               // D-Code (Optional)
7
    DATA_LIST *Block_Liste;       // Nur wenn dem G-Code ein Block folgt
8
} G_CODE;
9
10
typedef struct DB
11
{ 
12
    unsigned int X;               // X-Koordinate
13
    unsigned int Y;               // Y-Koordinate
14
    unsigned int PLOT_FUNCTION;   // D-Code
15
} DATA_BLOCK;
16
17
typedef struct Block
18
{
19
   union u_tag
20
   {
21
    G_CODE  G;                          //Falls das Element ein G-Code ist
22
    DATA_BLOCK data;                    //Falls das Element ein Data-Block ist     
23
   } u;
24
   struct Block *next;     
25
} DATA_LIST;

Aber compilieren geht immer noch nicht.

von Michael A. (micha54)


Lesenswert?

Hallo,

es fehlt die Vorwärtsdeklaration....

typedef Block_Liste Block_Liste_2;

typedef struct GC
{
    unsigned int G;               // G-Code
    unsigned int X;               // X-Koordinate (Optional)
    unsigned int Y;               // Y-Koordinate (Optional)
    unsigned int D;               // D-Code (Optional)
    DATA_LIST *Block_Liste_2;       // Nur wenn dem G-Code ein Block 
folgt
} G_CODE;


hab aber keinen Compiler zur Hand um das zutesten, meist endet sowas in 
einer längeren Fummelei.

Gruss,
Michael

von yalu (Gast)


Lesenswert?

So:
1
typedef struct Block DATA_LIST; // Vorwärtsdeklaration
2
3
typedef struct GC
4
{
5
  unsigned int G;               // G-Code
6
  unsigned int X;               // X-Koordinate (Optional)
7
  unsigned int Y;               // Y-Koordinate (Optional)
8
  unsigned int D;               // D-Code (Optional)
9
  DATA_LIST *Block_Liste;       
10
} G_CODE;
11
12
typedef struct ko
13
{ 
14
  unsigned int X;               // X-Koordinate
15
  unsigned int Y;               // Y-Koordinate
16
  unsigned int PLOT_FUNCTION;   // D-Code
17
} DATA_BLOCK;
18
19
struct Block
20
{
21
  union u_tag
22
  {
23
    G_CODE  G;                          
24
    DATA_BLOCK data;                         
25
  } u;
26
  struct Block *next;     
27
};

von Mati (Gast)


Lesenswert?

Hallo,

eine Vorwärtsdeklaration löst Dein Problem

struct DB;

typedef struct GC
{
    unsigned int G;               // G-Code
    unsigned int X;               // X-Koordinate (Optional)
    unsigned int Y;               // Y-Koordinate (Optional)
    unsigned int D;               // D-Code (Optional)
    DB *Block_Liste;       // Nur wenn dem G-Code ein Block folgt
} G_CODE;

typedef struct DB
{
    unsigned int X;               // X-Koordinate
    unsigned int Y;               // Y-Koordinate
    unsigned int PLOT_FUNCTION;   // D-Code
} DATA_BLOCK;

typedef struct Block
{
   union u_tag
   {
    G_CODE  G;                          //Falls das Element ein G-Code 
ist
    DATA_BLOCK data;                    //Falls das Element ein 
Data-Block ist
   } u;
   struct Block *next;
} DATA_LIST;

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.