Ein bißchen beeinflusst von Objektorientierter Programmierung, neige ich dazu, immer eigene Konstruktor-Funktionen zu bauen, die sich darum kümmern, dass eine Struktur _richtig_ initialisiert wird. Dazu gehört dann auch Unterstrukturen zu initialsieren, etc. Desweiteren ist es immer nützlich, Zeiger von Strukturen zu definieren und dann auf den Zeigern die richtigen Strukturen zu erzeugen. Eine Implementation, die funktioniert, wäre z.B.:

Code:
typedef struct
{
char tex_name[35];
var tex_id;
var tile_count;
} TEX_LAYER;

TEX_INFO* getTEX_LAYER()
{
TEX_LAYER* temp = (TEX_LAYER*)(malloc(sizeof(TEX_LAYER)));
//hier kannst du irgendwas initialisieren
return(temp);
}

typedef struct
{
TEX_LAYER* texinfo[10];
char vorschau[20];
char format[5];
} TEX_INFO;


TEX_INFO* getTEX_INFO()
{
TEX_INFO* temp = (TEX_INFO*)(malloc(sizeof(TEX_INFO)));
temp->texinfo = getTEX_LAYER();
//hier kannst du irgendwas initialisieren
return(temp);
}

void main ()
{
TEX_INFO* test123 = getTEX_INFO();
test123->texinfo->tex_id = 12345;
}



Folgendes Schema ist immer ganz nützlich, wenn man neue Strukturen einführt (zumindestens handhabe ich das so):

  • Struktur definiere und per typedef zu einem Datentyp machen
  • mindestens eine Konstruktorfunktion schreiben, die die Struktur komplett initialisiert und evtl. Unterstrukturen erzeugt und initialisiert.
  • Eventuell andere alternative Konstruktoren schreiben, die eine Parameterliste enthalten, um bestimmte Attribute zu initialisieren
  • Auch Destruktoren schreiben, die eine Struktur komplett entfernen. Wenn du außergewöhnliche Datentypen als Attribute hast (bitmaps, texts, andere eigene Strukturen), dann soll der Destruktor natürlich die ganz besonders anfassen. Ein simpler free Befehl hilft da nicht weiter (Unterschied flaches löschen und tiefes löschen!)
  • Getter und Setter Funktionen für die Variablen. Durch die -> Syntax kann man zwar bequem auf die Attribute zugreifen, aber eventuell ändert sich ja was in der Struktur oder in der Verarbeitung und dann sitzt man da und ändert das im gesamten Code ab. Gemäß des Sichtbarkeitsprinzips aus der OOP hab ich mir angewöhnt getter/setter Funktionen auch für meine C Strukturen zu schreiben. Vor allem weil man dann bei nicht trivialen Attributen gesondert darauf zugreifen/schreiben kann


In der Regel reicht dass dann aus, um einigermaßen sicher, ohne Compilerfehler und ohne Abstürze zur Laufzeit ordentlich zu arbeiten.