N'abend.
Ich hab mich entschlossen ein seltenes Problem welches mich schon wieder ereilt hat nun mal ausführlich zu beschreiben in der Hoffnung das es eine Erklärung dafür gibt.
Kurz als Erklärung : Vor mehr als mittlerweile 4 Jahren habe ich eine Point & Click Engine und das dazugehörige Autorensystem erstellt welches ich seit dem konstant erweitert und verbessert habe. (
www.adventure-creator.com) Die aktuelle Version ist bereits der 52. Release. Ich erwähne das nur deshalb um zu zeigen das ich schon viele Bugs finden musste und eigentlich immer weis wie ich dabei vorgehen muss um einen Fehler einzugrenzen. Bei dieser Art Problem versagt die übliche Herangehensweise leider. Also was ist passiert...
An einer bestimmten reproduzierbaren Stelle in einem Adventureprojekt entsteht ein Fehler der dafür sorgt das viele Variablen durcheinander gemischt werden, also wirklich so das a auf einmal den Inhalt von c hat und c den von x und so weiter. Beim letzten Male ist es mir gelungen eine Ursache zu finden. In einer Spieldatei waren noch Daten vorhanden die zu einem gelöschten Objekt verwiesen. Ich konnte diesen Fehler genau nachvollziehen und genau an der Stelle im Spiel wo der Fehler begann muss im Code versucht worden zu sein aus einem Array von 1..2000 den Eintrag -1 herauszulesen. Das hätte zu einer Zugriffsverletzung führen müssen!
Doch genau das geschah nicht. Statt dessen wurden eben viele Variablen durcheinander geschmissen was wiederrum zu zahlreichen Fehlern führte die mit dem Ursprungsbug gar nichts zu tun hatten. Um zu verdeutlichen das dieses Mischverhalten wirklich nicht logisch durch einen Fehler (oder mehrere) in meinem Code erklärt werden kann folgende Beobachtung :
Dieser Variablentausch ist reproduzierbar aber er läßt sich ändern und zwar in dem ich in den Variablendefinitionen Position von Einträge vertausche(!!) d.h.
Delphi-Quelltext
1: 2: 3: 4: 5:
| objektdaten = record name :string; size : tpoint; zustand : integer; end; |
läßt zum Beispiel andere Konfusionen entstehen als :
Delphi-Quelltext
1: 2: 3: 4: 5:
| objektdaten = record zustand : integer; name :string; size : tpoint; end; |
Nun stehe ich wieder vor diesem Effekt und habe nur die Erkenntniss das irgendwo im Code ein Fehler sein kann der eine Meldung auslösen hätte müssen aber stattdessen Chaos auslöst.
Ich muss dazu sagen, ich verwende das nun nicht mehr wirklich frische Delphi 7. Ein Upgrade würde mich zwingen einiges anzupassen da viele Komponenten die ich verwende entweder auch upgegradet werden müssten oder nicht vorhanden sind. Viel Arbeit die ich mir wirklich nur dann machen möchte wenn ich mir sicher sein kann das Problem damit zu beheben.
Wie kann es passieren das eine Zugriffsverletzung übergangen wird und zum Datenchaos führt? Achja, ich habe in meinem Code nicht eine einzige TRY FINALLY Stelle drin. Zugriffsverletzungen jeglicher Art müssten also immer zum Halt des Programms führen.
Danke schon mal für jeden der bis hier hin durchgelesen hat.
Moderiert von
Narses: Delphi-Tags hinzugefügt