AccessViolation - aber nichts verändert
-
Guten abend, bei mir hängt mal wieder.
Ich habe eine Klasse die einen längeren String auswertet. Dieser wird als allererstes an verschiedenen Stellen aufgetrennt und in einen Stringarray namens entry geschickt.
Nachdem der komplete String geteilt wurde sind so etwa 2-9 Arrayeinträge entstanden.
Diese werden jetzt nacheinander an eine Methode übergeben, die den Inhalt weiter zerstückelt, indem Substrings gebildet werden.
Diese Methode wird vom Programm an zwei verschiedenen Stellen aufgerufen, jedes mal sind die Daten exakt gleich. beim zweiten Mal jedoch tritt der Fehler "Im Projek xx.exe ist eine Exception der Klasse EAccessViolation aufgetreten. Meldung: Zugriffsverletzung bei Adresse 40004b60. Schreiben von Adresse..."
Die Zeile bei der der Fehler auftritt:
autor[ar_pos] = entr.SubString(posbegin+6, posende-posbegin-6);posende und posbegin stimmen, genauso wie ar_pos.
Ich hoffe dass es mal wieder jemand gibt, der mir helfen kann.
mfg
Raimond*edit* Wenn ich den Array der .h datei durch einen lokalen String autor eretze, dann gehts.../edit
-
Ich würde mal behaupten, dass Du auf ungültige Arrayadressen zugreifst.
Nutze doch mal den Debugger oder poste mehr Code.
-
Hallo
Debugger benutzen, um alle einzelne nWerte an der kritischen Stelle genau zu prüfen.
Insbesondere das Array und den index ar_pos./Edit : langsam...
bis bald
akari
-
posbegin hat den Wert 19
posende =34
ar_pos=0unt in entr steht sowas wie "<entry> <author><name>Gerringer</name><ur"
auf den Namen zwischen den <name> und </name> habe ich es abgesehen.
//Autorname posbegin = entr.AnsiPos("<name>"); posende = entr.AnsiPos("</name>"); autor[ar_pos] = entr.SubString(posbegin+6, posende-posbegin-6);Das merkwürde ist ja, dass es beim ersten aufrufder Klasse und deren Methoden problemlos funktioniert, nur beim 2. nicht.
Wenn ich den autor[ar_pos] jetzt mal durch "String test" ersetze, dann funktioniert es wieder
in der header:
String autor[100], //Name des Autors //published[100], //Veröffentlichungsdateum //updated[100], //Updatedatum titel[100], //Titel der Geschichte category[100], //Kategorie genre[100], //Genre (Drama, Romance) ............. letzer[100];
-
Hallo
eiun Überprüfung wert ist noch dir Frage, ob die Instanz der Klasse ansich überhaupt noch gültig ist, für die die Methode mit dem String-Zerlegen ausgeführt wird.
Ansonsten können wir nicht viel dazu sagen, zu wenig ist von dem Speicherverlauf erkennbar. Da must du selber mit dem Debugger alles einzeln kontrollieren.bis bald
akari
-
hi,
wenn du mir noch sagst wie ich vorschlag 1 und 2 durchführe dann gerne.
mfg
Raimond
-
Hallo
1. schau dir zur Entwurfzeit an, wo die Methode genau aufgerufen wird, und verfolge die Instanz die dazu benutzt wird. Wo kommt die her? Ist die zum Aufrufzeitpunkt noch gültig?
2. setzt so viele Brekpoints in relevanten Teilen wie möglich, geh mit F7 und F8 den Verlauf des Programmes durch und verfolge das Stack-fenster (Ansicht/Debug-Fenster/Aufruf-Stack). Dort siehst du welche Methoden sich nacheinander bis zu dem aktuellen Haltepunkt aufgerufen haben, und mit welchen Parametern. Achte auch NULL-Werte, wo keine sein dürfen.
bis bald
akari
-
Zuersteinmal vielen vielen vielen Dank für die Zeit und Gedult die ihr immer für mich aufbringt.
Offenbar lags daran, dass ich den Klassenaufruf so reingepackt habe:
__fastcall TMainprog::TMainprog(TComponent* Owner) : TForm(Owner) { TUpdate *test; test->UpdateDateien(); delete test; }mfg
Raimond
-
Wenn das hier dagestanden hätte
TUpdate *test = new TUpdate;dann hätte es vielleicht funktioniert.
Alternativ auch das.__fastcall TMainprog::TMainprog(TComponent* Owner) : TForm(Owner) { TUpdate test; test.UpdateDateien(); }