Delphi Zugriffsverletzung Zuordnung lokale variable
Dies scheint die einfachste Sache der Welt, und ich bin bereit, Sie zu ziehen meine Haare über Sie.
Ich habe eine Einheit, die wie folgt aussieht ;
Unit myUnit;
// ...
//normal declarations
//...
Public
//bunch of procedures including
Procedure myProcedure;
const
//bunch of constants
var
//bunch of vars including
myCounter:integer;
Implementation
Uses //(all my uses)
// All of my procedures including
Procedure myProcedure;
try
// load items from file to TListBox - this all works
except
on EReadError do begin
// handle exception
end;
end; //try
myCounter:=0; // <-- ACCESS VIOLATION HERE
while myCounter //...etc
Es ist eine einfache Zuordnung einer Variablen zu, und ich habe keine Ahnung, warum es dies tut. Ich habe versucht, deklarieren Sie die variable lokal auf dem Gerät, zu dem Verfahren, das weltweit - egal, wo ich versuche, es zu tun ich kann nicht zuordnen einen Wert von null auf eine Ganzzahl, erklärte überall, in dieser Prozedur, ohne es zu werfen eine Zugriffsverletzung. Ich bin Total ratlos.
Ich bin dem Aufruf der Prozedur, die aus einem button-OnClick-handler in der gleichen Einheit, aber egal wo ich es aufrufen, es wirft die Ausnahme. Das verrückte an der Sache ist, dass ich die genaue gleichen Sache, in ein Dutzend anderen Orten in Einheiten, die alle über das Programm ohne Probleme. Warum hier? Ich bin bei einem total Verlust.
- Können Sie den genauen text der Fehlermeldung Zugriff Verstoß, einschließlich der Adressen? Das könnte bedeutsam sein.
- --------------------------- Debugger Exception Notification --------------------------- Projekt .exe ausgelöste exception-Klasse EAccessViolation mit Meldung 'Zugriffsverletzung bei Adresse 0043FDE8 in Modul '.exe'. Lesen von Adresse 00000008'. --------------------------- Pause Weiter Helfen ---------------------------
Du musst angemeldet sein, um einen Kommentar abzugeben.
Read of address 00000008
bedeutet, dass beim Lesen einer variable bei einem offset von 8 bytes sind aus einer null Zeiger. Das passt nicht, was Sie zu tun versuchen hier alle, da Sie schreiben, nicht Lesen, und schreiben Sie eine Konstante, keine variable Lesen von irgendwo.Sind Sie sich sicher, dass dies die eigentliche Linie, die für das auslösen der Ausnahme? Haben Sie setzen einen breakpoint auf diese Zeile? Haben Sie versucht, verschieben Sie diese Zeile an den Anfang der Prozedur?
Ist es schwer sicher zu sein, ohne Ihre eigentliche code vor mir, aber wenn ich raten müsste, würde ich sagen, dass die Linie vor dadurch verursacht wird, dass die Ausnahme, und dann wird der instruction pointer hat bereits erhöht, so dass Delphi-highlights der nächsten Zeile.
Ich glaube nicht, dass dein Fehler bedeutet, etwas wie das, was es scheint. Wenn Sie eine Zugriffsverletzung aus einem Stück code wie dieser, hat keine vernünftige Weise zu produzieren, kann eine Zugriffsverletzung suchen Sie auf Papierkorb-Speicher in einigen fashion.
Schritt durch den fehlerhaften code im CPU-Fenster und sehen, was wirklich geschieht.
Die Sie mit Anweisungen und sind auf der Suche an einem anderen myCounter?
Einen Teil des Codes wird das schreiben in den Speicher sollte es nicht oder zu befreien, während Sie es nicht sollten, und das durch Zufall, es ergibt sich in der AV ist beim Zugriff auf das spezifische lokale variable?
Die Zuordnung myCounter := 0 wirft eine Zugriffsverletzung deutet darauf hin, dass entweder das Daten-segment, dass die globalen vars gespeichert sind, wurde aus dem Arbeitsspeicher entfernt wird, oder dass die Register abgespritzt in Ihre myProcedure routine.
Verwenden Sie die CPU-Ansicht, um zu sehen, welche Register verwendet werden, um auf die Globale var, und dann von dort nach hinten arbeiten, um zu sehen, wo das/die Register schief gehen.
Bewegen MyCounter bis an die Spitze des var-Liste, und sehen, ob es immer noch passiert. Wenn das problem verschwindet, Blick auf die vars deklariert oben, wo Sie es jetzt haben - möglicherweise finden Sie etwas Interessantes, wie ein array, der zunehmend an seiner Grenze.