Delphi-Zugriffsverletzung beim Zuweisen einer lokalen Variablen

8

Das scheint die einfachste Sache der Welt zu sein und ich bin bereit, meine Haare darüber zu ziehen.

Ich habe eine Einheit, die so aussieht;

%Vor%

Es ist eine einfache Zuweisung einer Variablen und ich habe keine Ahnung, warum es das tut. Ich habe versucht, die Variable lokal für die Einheit, für die Prozedur, global zu deklarieren - egal, wo ich es versuche, kann ich keiner Ganzzahl, die irgendwo deklariert ist, innerhalb dieser Prozedur einen Wert von Null zuweisen, ohne dass sie einen Zugriff verursacht Verstoß. Ich bin total ratlos.

Ich rufe die Prozedur von innerhalb eines OnClick-Handlers der Schaltfläche aus innerhalb derselben Einheit auf, aber egal, von wo aus ich sie anrufe, löst sie die Ausnahme aus. Das Verrückte daran ist, dass ich genau dasselbe an einem Dutzend anderer Stellen in Einheiten des ganzen Programms ohne Probleme mache. Warum hier? Ich bin total am Ende.

    
J... 27.04.2010, 17:03
quelle

5 Antworten

10

Read of address 00000008 bedeutet, dass Sie eine Variable mit einem Offset von 8 Byte von einem Zeiger nil lesen. Das passt nicht zu dem, was Sie hier überhaupt machen wollen, da Sie schreiben, nicht lesen, und Sie schreiben eine Konstante, keine Variable, die von irgendwo gelesen wird.

Sind Sie sicher, dass dies die tatsächliche Zeile ist, die die Ausnahme auslöst? Haben Sie auf dieser Linie einen Haltepunkt gesetzt? Haben Sie versucht, diese Zeile an den Anfang der Prozedur zu verschieben?

Es ist schwer, sicher zu sein, ohne Ihren eigentlichen Code vor mir, aber wenn ich raten müsste, würde ich sagen, dass die Zeile vor die Ausnahme auslöst, und dann den Anweisungszeiger wurde bereits inkrementiert, so dass Delphi die nächste Zeile markiert.

    
Mason Wheeler 27.04.2010, 17:36
quelle
2

Ich glaube nicht, dass dein Fehler etwas Ähnliches bedeutet. Wenn Sie eine Zugriffsverletzung von einem Codeabschnitt wie diesem erhalten, der keine vernünftige Möglichkeit zum Erstellen einer Zugriffsverletzung hat, sehen Sie sich in gewisser Weise den Papierkorb an.

Durchlaufen Sie den fehlerhaften Code im CPU-Fenster und sehen Sie, was wirklich passiert.

    
Loren Pechtel 27.04.2010 17:09
quelle
1

Sie verwenden Statements und betrachten einen anderen myCounter?

Irgendein Teil Ihres Codes schreibt in den Speicher, den er nicht schreiben sollte, oder während er es nicht tun sollte, und dass er zufällig beim Zugriff auf diese spezifische lokale Variable zu AV führt?

    
Lars Truijens 27.04.2010 17:10
quelle
1

Die Zuweisung myCounter: = 0, die eine Zugriffsverletzung auslöst, legt nahe, dass entweder das Datensegment, in dem die globalen Variablen gespeichert sind, aus dem Speicher entfernt wurde oder dass die Register in Ihrer myProcedure-Routine gesperrt sind.

Verwenden Sie die CPU-Ansicht, um zu sehen, welche Register für den Zugriff auf die globale Variable verwendet werden, und arbeiten Sie dann von dort rückwärts, um zu sehen, wo diese Register fehlschlagen.

    
dthorpe 27.04.2010 17:11
quelle
0

Bewegen Sie MyCounter an den Anfang der Var-Liste und sehen Sie, ob es noch immer passiert. Wenn das Problem verschwindet, sehen Sie sich die oben erklärten Vars an, wo Sie sie jetzt haben - Sie könnten etwas Interessantes finden, wie ein Array, das über seine Grenze hinaus wächst.

    
Chris Thornton 27.04.2010 17:08
quelle