Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Fr Jul 04, 2025 16:23

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 9 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Unerklärliche Zugriffsverletzung
BeitragVerfasst: Di Mai 04, 2010 15:06 
Offline
DGL Member
Benutzeravatar

Registriert: Do Okt 16, 2008 13:18
Beiträge: 252
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

_________________
You even trying ...

Website: http://rise-of-light.de/


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Mai 04, 2010 17:19 
Offline
DGL Member

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.

Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Mai 04, 2010 17:56 
Offline
DGL Member

Registriert: Fr Okt 03, 2008 13:32
Beiträge: 367
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.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Mai 04, 2010 20:00 
Offline
DGL Member
Benutzeravatar

Registriert: Do Okt 16, 2008 13:18
Beiträge: 252
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.

_________________
You even trying ...

Website: http://rise-of-light.de/


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Mai 04, 2010 20:17 
Offline
DGL Member

Registriert: Do Jun 28, 2007 17:58
Beiträge: 193
Programmiersprache: Pascal, C
mori hat geschrieben:
... leider kann man im DLL-Code ja keine Haltepunkten setzen.

Wenn du Delphi verwendest geht das einwandfrei, sobald das DLL-Projekt in der Projektgruppe ist...

_________________
http://audorra.sourceforge.net//http://andorra.sourceforge.net


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Mai 04, 2010 20:20 
Offline
DGL Member

Registriert: Fr Okt 03, 2008 13:32
Beiträge: 367
mori hat geschrieben:
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.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Mai 05, 2010 07:18 
Offline
DGL Member
Benutzeravatar

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

Projekte: https://github.com/tak2004


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Mai 05, 2010 09:35 
Offline
DGL Member
Benutzeravatar

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.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Mai 05, 2010 11:21 
Offline
DGL Member
Benutzeravatar

Registriert: Do Okt 16, 2008 13:18
Beiträge: 252
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.

_________________
You even trying ...

Website: http://rise-of-light.de/


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 9 Beiträge ] 
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 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.

Suche nach:
Gehe zu:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.013s | 18 Queries | GZIP : On ]