Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.155 Beiträge
 
Delphi 12 Athens
 
#9

AW: Bugs und Zugriffsverletzungen in meinem Spiel (Aspirin)

  Alt 25. Okt 2012, 12:59
So, daß heißt also es wird auf etwas zugrgriffen, was es nicht gibt ... und das kann man sehr leicht nachprüfen.

Zitat:
Und eine richtige Zeile gibts ja nur für die Zugriffsverletzung.
Die wäre dann bei if ((IsCollision(Gegner[k].BoundsRect, Spieler.BoundsRect)) and (Gegner[k].Cooldown<=0))Then bei //Kollision Gegner und Spieler
Ausgehn würde man erstmal davon, daß der Fehler auch in dieser Zeile liegt (das stimmt nicht immer, da sich der Debugger auch manchmal täucht/verläuft).

Also entweder liegt es am IF oder an dem, was in IsCollision liegt.
(falls es an is colision liegt, dann kann man den Inhalt )


Da es ein nicht "direkt" reproduzierbarer Fehler ist, hilft ein Haltepunkt nicht viel, da man nun jede Ausführung dieser Zeile prüfen müßte, bis es knallt (das kann dauern).

Man läßt es nun also erstmal knallen und schaut sich nach dem Knall im Debugger die Variablen an.
Dort suchst du nun nach einem nil.

Leider sind sind nach einer exception "manchmal" keine Variableninhalte lesbar


Also hilft man sich ganz einfach mit einem Schutzblock, welcher um den code drumrum kommt, wo man den Fehler vermutet.
In dem Except-Block kann man sich entweder via ShowMessage und Co. Variableninhalte anzeigen lassen
oder man kopiert den Code nochmals dort rein (nur sinnvoll wenn mit einem reproduzierbaren Ergebnis zu rechnen ist).

bei dir also
Delphi-Quellcode:
for ... do
  try
    if ... then
    begin
      ...
    end;
  except
    if ... then // hier der Haltepunkt
    begin
      ...
    end;
  end;
Wenn es knallt, dann landet man im Except und kann den Code nochmals ausführen.
Dieses mal Schritt für Schritt und dabei guckt man sich "vorher" die Variableninhalte an.

Bei dir ist es also speziell der Inhalt von Gegner, an der Position k,
bzw. der Inhalt von IsColition.
Daß "Spieler" verschwindet, schließe ich einfach mal aus, aber prüfen kann man es denoch. (ist ja kein Aufwand)



Und zusätzlich nochmals:
- wie vorher schonmal beschrieben, soltest du gewisse Einstellungen in den Projektoptionen vornehmen, womit bestimmte Prüfungen von Delphi automatisch eingebaut werden
- manchmal kann es nicht schaden, wenn man geziehlt FreeAndNil verwendet, statt nur .Free (aber bei der genannten Fehlermeldung, ist sowas erstmal nicht nötig, da es sowieso schon nil ist)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (25. Okt 2012 um 13:03 Uhr)
  Mit Zitat antworten Zitat