mikrocontroller.net

Forum: PC-Programmierung ANSI-C typedef Problem


Autor: Michael Leske (nemesisod)
Datum:

Bewertung
0 lesenswert
nicht 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:
typedef struct Block
{
   union u_tag
   {
    G_CODE  G;                          
    DATA_BLOCK data;                         
   } u;
   struct Block *next;     
} DATA_LIST;

typedef struct ko
        { 
          unsigned int X;               // X-Koordinate
          unsigned int Y;               // Y-Koordinate
          unsigned int PLOT_FUNCTION;   // D-Code
        } DATA_BLOCK;
        
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;       
        } 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

Autor: Michael Appelt (micha54)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Michael Leske (nemesisod)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Michael,

danke erstmal für deine schnelle Antwort,
ich habe es nun umgestellt :
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;       // 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;

Aber compilieren geht immer noch nicht.

Autor: Michael Appelt (micha54)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: yalu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So:
typedef struct Block DATA_LIST; // Vorwärtsdeklaration

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;       
} G_CODE;

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

struct Block
{
  union u_tag
  {
    G_CODE  G;                          
    DATA_BLOCK data;                         
  } u;
  struct Block *next;     
};

Autor: Mati (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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;

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.