Hi, ich arbeite schon seit längerem an meinem Spiel, letzte Woche tauchte für etwa 3 Tage am Anfang meines Programms ein Fehler auf, dieser verschwand dann aber wieder. Jetzt ist der Fehler wieder aufgetaucht und ich habe keine Ahnung warum. Das Problem tritt bei meiner MouseMove Prozedur auf, dazu übergibt das Programm der DLL die XY-Daten in einer Prozedur, die sie an eine Klasse weiterleitet welche die Maus auswertet (Doppelklicks usw.). Ich muss die Meldung nur wegklicken danach läuft das Programm Fehlerfrei. Die Meldung lautet immer gleich "AC bei 00D5B9CE Adresse Lesen von Adr. 00000010". Hier ist nochmal der Code der Fehler Prozedur:
Code:
procedure DL_MouseMove(X,Y:Single); stdcall; var CX,CY:Single; begin if (GameState=1) or (GameState=3) then begin CX:=1+((X/WinWidth)*Menu.Width); CY:=1+((Y/WinHeight)*Menu.Height); Menu.MouseMove(CX,CY); end; end;
Ich hoffe ihr könnt mir helfen.
PS:Ich arbeite zwar mit Threads aber Menu.MouseMove benutzt intern eine CriticalSection
Registriert: Di Okt 13, 2009 17:25 Beiträge: 365
Programmiersprache: C++
Du wirst irgendwo einen Pointer haben, der wahrscheinlich nur minimal oder gar nichts mit deiner MouseMove zu tun hat. Ich tippe mal auf ein dynamisches Array, dessen Startpointer = nil ist. Dann willst du auf das zweite (oder in Pascal vielleicht auch das erste) Objekt aus diesem Array zugreifen. Da ein so ein Objekt, aus denen das Array besteht, die Größe 16 Bytes hat, bekommst du eine Zugriffsverletzung an der Stelle 0x00000000 + 0x00000010 = 0x00000010. Prüfe also mal alle deine Array-Pointer insbesondere die, die eine entsprechende Objectgröße von 16, 8 oder 4 Bytes haben. Kann aber natürlich auch was ganz anderes sein, wie immer bei Access Violations.
Gruß mrtrain
Zuletzt geändert von mrtrain am Mi Aug 31, 2011 18:44, insgesamt 1-mal geändert.
Wenn ich mir den Code so ansehe, springt mir als erstes "Menu" als mögliche Fehlerquelle ins Auge. Klassen sind geradezu prädestiniert für solche Zugriffsverletzungen. Ich denke mal wenn der Fehler in der Prozedur kommt kann es nur das sein. Vielleicht wird die Prozedur schon einmal aufgerufen bevor "Menu" initialisiert wurde. Besonders da der Fehler nur einmal kommt.
Ich schaue mal, übrigens gibt es die Meldung auch wenn ich Menu.MouseMove(CX,CY); rausstreiche und nen ShowMessage setze damit der Comiler das nicht rausstreicht. Ich suche gerade nach Arrays die nil sind, leider kann man im DLL-Code ja keine Haltepunkten setzen.
Ich schaue mal, übrigens gibt es die Meldung auch wenn ich Menu.MouseMove(CX,CY); rausstreiche [...]
Die Zugriffsverletzung würde auch schon bei "Menu.Width" 2 Zeilen drüber kommen. Tatsächlich ist es sogar so dass man Methoden ohne Fehler ausführen kann auch wenn die Instanz dazu garnicht existiert. Aber sobald man auf eine Variable zugreift gibts einen Fehler. Das liegt daran das nur die Variablen für jede Instanz kopiert werden, die Methoden aber irgendwo zentral liegen.
Registriert: Di Mai 18, 2004 16:45 Beiträge: 2623 Wohnort: Berlin
Programmiersprache: Go, C/C++
Jupp Variablen sind Objektbasiert und existieren im Objekt. Dabei wird dann der Object pointer genommen und auf den Variablenpointer Offset, also differenz zwischen Klassenstart und Variablenposition, addiert. Bei Methoden ist das einfacher, da ist der pointer direkt auf der Klasse, die ja nur einmal existiert. Um dann so zu tun, als ob das Objekt die Methode besitzt wird ein self Parameter, versteckt mit jeder Methode übergeben. Das Objekt wird also automatisch bei jeder Methode übergeben und kann dann über self erreicht werden.
BTT: Nur weil du jetzt die Access Violation bekommst, heisst es nicht, dass es damit was zu tun hat. Im schlimmsten Fall hast du ein String, pointer oder dynamischen array falsch benutzt und die AV kommt nur wesentlich später, wenn sich die Speicherbereiche eines zukünftigen Calls mit einen alten Speicherblock überlappen. Wenn die AV kommt debugger anhalten, callstack durch gehen und jede dynamisch erzeugte Variable prüfen. Würde ich jetzt mal so als Rat geben,
_________________ "Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren" Benjamin Franklin
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Zitat:
Nur weil du jetzt die Access Violation bekommst, heisst es nicht, dass es damit was zu tun hat.
Ähm. Doch! Wie wäre es, wenn du dir die Adresse mal genau anschaust? Bei anderen Adressen würde ich das gelten lassen aber nicht bei etwas so Offensichtlichem.
Solch kleine Adressen (0x00000010) deuten IMMER darauf hin, dass auf ein Objekt/Speicher zugegriffen wurde was nil ist. Bzw genauer gesagt bei einem Objekt auf ein Member zugegriffen wurde. Der Code alleine ist unproblematisch.
mori: Du solltest da in der Tat mal schauen, wann welcher Code von dir aufgerufen wird. Und da ist der Debugger echt goldwert. Wie Igel schon sagte ist es problemlos möglich, wenn die beiden Projekte sind in der einer Projektgruppe befinden. Alternativ kannst du auch bei deinem DLL Projekt unter "Start" > "Parameter" > "Host Anwendung" die Exe eintragen. Dann kannst du aktiv nur an der DLL schrauben wärend du das Projekt auch starten kannst. Ich meine seit 2007 kann man auch Abhängigkeiten zwischen den Projekten einstellen, allerdings würde er alle voneinander abhängigen Projekte trotzdem immer kompilieren/überprüfen müssen. Auch wenn sich nur was an der dll geändert hätte. Wird dann etwas zäh von der Bedienung.
Ich habe den Fehler gefunden. Menu ist am Anfang noch nil, da es im Zeichenthread erzeugt wird. Ich werde den Fehler jetzt beheben, danke an alle.
Der Fehler lag daran das im Init-Teil eine Enter/Leave-Block lag der das weitere ausführen des Programms bis zum laden verhindern sollte. Leider ist mein Hauptprogramm erst zu Enter/Leave gekommen und somit bevor die Initprozedur die Criticalsection sperren konnte.
Mitglieder in diesem Forum: 0 Mitglieder und 0 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.