![]() |
Hilfe beim Beheben einer Access Violation
Liste der Anhänge anzeigen (Anzahl: 1)
Hi,
in ![]() Ich habe diese schon mehrfach im Debugger abgefangen. Sie treten auf, wenn ich auf einen Stein zugreife. Zum Aufbau des Programms (Sourcecode hängt auch unten an): Ich habe einen Array[1..400] of tStein. Dieser wird am Anfang mit Steinen bis an den Rand gefüllt und dann werden Einzelne dieser Steine immer wieder zerstört. Ich gehe sehr oft diesen Array durch und greife dabei dann auf bestimmte Steine zu (natürlich nachdem ich geprüft habe, dass diese nicht nil sind und dass diese nicht "deaded" sind (das ist die Andorra2D-Methode (der Grafikengine, die ich benutzte), Sprites zu töten). Und genau bei diesen Zugriffen passiert es. Das komische ist, dass es nicht immer passiert. Man kann gerne mal fünf Spiele spielen, ohne das etwas passiert, und bei sechsten schmeisst er dann mit Fehlern um sich. Noch ein Kommentar zum Sourcecode: Er ist technisch gesehen sicherlich nicht sonderlich schön. Aber ich habe ihn ein wenig Kommentiert und strukturiert ist er auch, er sollte eigentlich relativ leicht zu lesen sein. Verbesserungsvorschläge und Unschönheiten in meiner Arbeit nehme ich allerdings gerne entgegen, man will ja dazulernen ;) Erstellt wurde er mit Delphi 7, später zu Delphi 2009 konvertiert. Die Projektdatei ist also für D2009. Es ist mir eigentlich relativ egal, was ihr mit dem Sourcecode macht. Nur wenn ihr ihn modifizieren wollt, dann lasst doch bitte meinen Namen dabei stehen. Danke schonmal, Roman EDIT: Hier bekommt ihr Andorra2D her: ![]() |
Re: Hilfe beim Beheben einer Access Violation
Hallo,
AdDraws not found. Ist wohl diese Andorra ? Warum hängt das nicht mit dan ? *faul* Ausserdem gibt es je verschieden Versions-Stände. Heiko |
Re: Hilfe beim Beheben einer Access Violation
Zitat:
![]() |
Re: Hilfe beim Beheben einer Access Violation
Hallo,
nunja ;( klappt ja erst ab D7 (habe hier D6). Aber Das hier so komisch aus.
Delphi-Quellcode:
Bist dui dir sicher, dass die Stein auch wirklich als Klasse (Objekt) gelöscht werden.
for i := 1 to 400 do
if (Steine[i] <> nil) AND not (Steine[i].Deaded) then Steine[i].dead; XXX Steine[arr] := tStein.Create(AdSpriteEngine); Steine[arr].einrichten(offsetX, offsetY, random(5)); Scheibe mal einen destructor für TStein und setze mal nen BreakPoint. Der Destructor muss ja bei .dead aufgerufen werden. Ausserdem würde ich mal mit memcheck oder FastMM4 prüfen, ob irgendwelche Speicherlecks drin sind. Heiko |
Re: Hilfe beim Beheben einer Access Violation
Danke für deine Antwort.
Zitat:
Zitat:
|
Re: Hilfe beim Beheben einer Access Violation
Hallo,
memcheck finde ich einfacher in der dpr als erste unit mit uses MemCheck, Memcheck einbinden ( ![]() und als 1. Befehl nach dem Begin begin MemChk; Damit wird NACH dem Programm laufen (also nach dem Beenden) Speicherlecks angezeigt. Heiko |
Re: Hilfe beim Beheben einer Access Violation
Also, mit memcheck crasht das Ding sofort am Start. Warscheinlich inkompatibel zu D2009?
|
Re: Hilfe beim Beheben einer Access Violation
Hey,
probiers mal mit FastMM! |
Re: Hilfe beim Beheben einer Access Violation
Hallo,
< Also, mit memcheck crasht das Ding sofort am Start. Warscheinlich inkompatibel zu D2009? > hm ? Mal nen breakpoint in die dpr gesetet ? Heiko |
Re: Hilfe beim Beheben einer Access Violation
HI,
keine Ahnung, ob das weiterhilft, aber nutze mal zum Zerstören FreeAndNil. So hast du auf jeden Fall ein NULL-Objekt. Und auch bei Exceptions beim Free - mal den Wert mit nil überschreiben (auch wenn dann ein Speicherleck entsteht). Ansonsten, wie gesagt: Schnelle boolische Auswertung mit {$B+} anschalten. Bernhard |
Re: Hilfe beim Beheben einer Access Violation
Zitat:
Zitat:
|
Re: Hilfe beim Beheben einer Access Violation
Hallo,
nein, damit erreicht du das Gegenteil. Zur Frage, was das ist, gibt es doch die schöne Hilfe ? Akademisches Bsp:
Delphi-Quellcode:
Es wird nur der 1. Teil ausgewertet,
function Foo: Integer;
begin Result:= 1; end; {$B+} a:= 0; if (a=0) or (b=Foo) da das Endergebnis ja schon True ist Foo als Funktion wird überhaupt nicht angesprungen. Das kann gut sein, oder nicht, je nachdem, ob der Programmierer in Foo etwas macht, was immer gemacht werden soll, oder nicht. Ist immer lustig, solche Sachen zu suchen und zu finden. Heiko |
Re: Hilfe beim Beheben einer Access Violation
Zitat:
Zitat:
|
Re: Hilfe beim Beheben einer Access Violation
|
Re: Hilfe beim Beheben einer Access Violation
HI
FreeAndNil ist eine Delphi-Prozedur aus der Sysutils-Unit. Der interne Aufbau sieht wie folgt aus:
Delphi-Quellcode:
Zuerst wird Temp das Objekt (die Komponente oder sonst was) zugewiesen. Dann wird der VAR-Parameter auf nil gesetzt. -> Fazit: er ist eindeutig nil. Danach wrd noch das Objekt aus dem Speicher geräumt. Achtung: Da .Free von TObject aufgerufen wird, darf diese Prozedur nirgendwo überschrieben werden, was bei manchen Programmierern manchmal vorkommt. Zerstört wird in .Destroy.
procedure FreeAndNil(var Obj);
var Temp: TObject; begin Temp := TObject(Obj); Pointer(Obj) := nil; Temp.Free; end; Bernhard |
Re: Hilfe beim Beheben einer Access Violation
Zitat:
|
Re: Hilfe beim Beheben einer Access Violation
Naja, {B+} hat doch nicht geholfen. Schade, ich hatte 9 Spiele am Stück, das sah so gut aus :|
Zitat:
|
Re: Hilfe beim Beheben einer Access Violation
Zitat:
Vllt. noch jemand eine Ahnung? |
Re: Hilfe beim Beheben einer Access Violation
Nein Free ist eine Methode der Basis-Klasse TObject, von welcher alle Klassen direkt oder indirekt abgeleitet sind. Überschreibt man diese Methode sollte man am ende die geerbete Aufrufen:
Delphi-Quellcode:
procedure TMeineKlasse.Free();
begin ... inherited; end; |
Re: Hilfe beim Beheben einer Access Violation
Zitat:
EDIT: Habs schon gefunden. Hatte mich bloß verlesen. Das löst das Problem mit der Acces Violation! Danke! |
Re: Hilfe beim Beheben einer Access Violation
kannst du den stack inhalt sehen wenn die AV kommt?
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:45 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz