?
Sag mal, Wutz, für jemanden mit deinem Kenntnisstand reißt du das Maul regelmäßig erstaunlich weit auf. Würde es dich umbringen, einen Post zu lesen und über seinen Inhalt nachzudenken, bevor du dessen Autor beschimpfst? Mit polemischer Kritik, die an der Sache völlig vorbei geht und deren fachlicher Inhalt selbst dann höchst fragwürdig wäre, wenn sie es nicht täte, lässt du dich selbst ziemlich lächerlich aussehen. Kleiner Tip:
WindowOpt_typ winopt;
fordert ganz ohne malloc einen Speicherbereich an und könnte durchaus als absolute Grundlage der C-Programmierung bezeichnet werden.
Aber zurück zum eigentlichen Problem: Gibt es der Standard wirklich her, ein Struct gleichtypiger Member als Array zu behandeln? Im Grunde macht Anaconda55 ja in Folgendes:
typedef union {
WindowData_typ *wd;
WindowOpt_typ *wo_array;
} WindowData_punner;
WindowData_punner punner;
punner.wd = graphwin;
for(i = 0; i < 4; ++i) {
punner.wo_array[i].State = 0;
punner.wo_array[i].Value = 0;
}
...und ich bin mir gerade nicht sicher, dass diese Art des Type-Punnings definiertes Verhalten ist. In der Praxis wird es wohl in der Regel funktionieren, weil Typen kein Alignment haben können, das größer ist als sie selbst und Padding damit in so einem Fall unnötig wird, aber kann man sich darauf verlassen, dass kein Compiler einem da etwas dazwischen schreibt?
Meine Überlegungen gehen hier hauptsächlich in Richtung struct packing - wenn etwa später Speicher gespart werden soll und WindowOpt_typ gepackt wird, WindowData_typ aber nicht, darf der Compiler dann Padding in WindowData_typ zwischen die WindowOpt_typ-Member legen? Ich habe im Standard nichts gefunden, was dies ausschließt, muss allerdings zugeben, dass ich gcc gerade nicht dazu überreden kann, etwas derartiges zu tun.
Es kann gut sein, dass ich etwas übersehen habe; wenn dem so ist, klärt mich bitte auf. Trotzdem würde ich zumindest einen Testcase anlegen, der das Layout von WindowData_typ prüft, um die Gefahr auszuschließen, beim Portieren auf eine andere Plattform plötzlich seltsame Fehler zu kriegen und keine Idee zu haben, woran es liegen könnte.