Entwickler-Ecke
Sonstiges (Delphi) - EAccessviolation - Pos()
the-kecks - Sa 07.03.09 22:09
Titel: EAccessviolation - Pos()
hi, ich schon wieder^^
ich habe mal wieder ein problem. bei mir kommt immer eine EAccessviolation bei einer pos abfrage obwohl das in eine stringlist geladene file was mittels pos durchsucht wird existiert und die stringlist korrekt geladen/createt worden ist -.-
Debugger:
Erste Zufalls-Exception bei $7555F35F. Exception-Klasse EAccessViolation mit Meldung 'Zugriffsverletzung bei Adresse 7683787C in Modul 'RPCRT4.dll'. Schreiben von Adresse BE6606E4'. Prozess Project1.exe (4752)
code:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33:
| procedure TForm1.Button1Click(Sender: TObject); var filetxt : Tstringlist; i2 : Integer; str : String; begin Dateipfad:=edit1.Text; str:=edit2.Text; filetxt:=TStringList.Create; if pos('.txt', Dateipfad) >0 then begin if FileExists(Dateipfad) then begin filetxt.LoadFromFile(Dateipfad); for i2:=0 to filetxt.count do if pos(str, filetxt[i2]) >0 then begin antwort:=edit2.text; filetxt.free; end else begin antwort:='NG'; Filetxt.free; end; end; end else begin showmessage('Datei wurde nicht gefunden!'); exit; end; |
mfg
Keldorn - Sa 07.03.09 22:18
Hallo
es muß
Delphi-Quelltext
1:
| for i2:=0 to filetxt.count-1 do |
Delphi-Quelltext
1:
| if pos(str, filetxt[i2]) >0 then |
jain,
Du gibst die stringliste immer wieder frei -> beim nächsten Schleifendurchlauf ist sie nicht mehr existent und führt zur AV.
Das free gehört ans Ende (wo du nicht mehr auf die Stringliste zugreifst ) und in einen try-finally-Block. Von der struktur her kannst du auch auf das exit verzichten.
deine Einrückung zum letzten else-Zweig ist für mich nicht vorteilhaft.
Gruß Frank
the-kecks - Sa 07.03.09 22:50
danke! aber jetz kriege ich "listenindex überschreitet das maximum(0)" obwohl doch eigentlich alles korrekt geladen wurde (oder?).
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21:
| if pos('.txt', Dateipfad) >0 then begin if FileExists(Dateipfad) then begin filetxt.LoadFromFile(Dateipfad); for i2:=0 to filetxt.count-1 do if pos(str, filetxt[i2]) >0 then begin antwort:=edit2.text; end else begin antwort:='NG'; end; end; end else begin showmessage('Datei wurde nicht gefunden!'); exit; end; |
PS: es funzt auch ohne -1 ;)
mfg
Dunkel - Sa 07.03.09 23:10
the-kecks hat folgendes geschrieben : |
PS: es funzt auch ohne -1 ;) |
Manchmal schon, zumindest so lange man nur lesend auf den nicht allozierten Speicher zugreift (was Du definitiv machst, wenn Du bis .Count auf die TStringList zugreifst).
jaenicke - Sa 07.03.09 23:15
the-kecks hat folgendes geschrieben : |
| danke! aber jetz kriege ich "listenindex überschreitet das maximum(0)" |
Das heißt, dass der Index 0 schon höher als der maximale Index ist. Also ist kein Eintrag in der StringList.
the-kecks - Sa 07.03.09 23:24
ja das ist mir klar aber ich habe das file doch auf jedenfall geladen weil ich ja das mit "if FileExists(Dateipfad) then" eingefügt hab.
mfg
the-kecks - So 08.03.09 01:26
hab das problem selbst gelöst
mfg
Dunkel - So 08.03.09 02:56
the-kecks hat folgendes geschrieben : |
| hab das problem selbst gelöst |
Darf man fragen was "geklemmt" hat. U.U. hat jemand anderes ein ähnliches Problem.. Du wärst auch froh, wenn Du die Lösung zu Deinem Problem über eine simple Suchanfrage im Forum gelöst bekommen würdest, oder? Dann hilft ein Beitrag wie "OK, hat sich erledigt, funzt" nicht wirklich...
the-kecks - So 08.03.09 03:23
the-kecks hat folgendes geschrieben : |
danke! aber jetz kriege ich "listenindex überschreitet das maximum(0)" obwohl doch eigentlich alles korrekt geladen wurde (oder?).
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21:
| if pos('.txt', Dateipfad) >0 then begin if FileExists(Dateipfad) then begin filetxt.LoadFromFile(Dateipfad); for i2:=0 to filetxt.count-1 do if pos(str, filetxt[i2]) >0 then begin antwort:=edit2.text; end else begin antwort:='NG'; end; end; end else begin showmessage('Datei wurde nicht gefunden!'); exit; end; |
PS: es funzt auch ohne -1 ;)
mfg |
hier der richtige code:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23:
| if pos('.txt', Dateipfad) >0 then begin if FileExists(Dateipfad) then begin filetxt.LoadFromFile(Dateipfad); for i2:=0 to filetxt.count-1 do begin if pos(str, filetxt[i2]) >0 then begin antwort:=edit2.text; end else begin antwort:='NG'; end; end; end; end else begin showmessage('Datei wurde nicht gefunden!'); exit; end; |
mfg
Dunkel - So 08.03.09 03:47
Muchas Gracias! :D
Tja, was eine ordentliche Code-Formatierung (oder
gExperts [
http://www.gexperts.org/]) alles aus macht. Da sieht man ein fehlendes end auf den ersten Blick.
jaenicke - So 08.03.09 04:46
Ich rücke die beiden Versionen einmal richtig ein. Alte Version:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21:
| if pos('.txt', Dateipfad) >0 then begin if FileExists(Dateipfad) then begin filetxt.LoadFromFile(Dateipfad); for i2:=0 to filetxt.count-1 do if pos(str, filetxt[i2]) >0 then begin antwort:=edit2.text; end else begin antwort:='NG'; end; end; end else begin showmessage('Datei wurde nicht gefunden!'); exit; end; |
Dein neuer Code:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23:
| if pos('.txt', Dateipfad) >0 then begin if FileExists(Dateipfad) then begin filetxt.LoadFromFile(Dateipfad); for i2:=0 to filetxt.count-1 do begin if pos(str, filetxt[i2]) >0 then begin antwort:=edit2.text; end else begin antwort:='NG'; end; end; end; end else begin showmessage('Datei wurde nicht gefunden!'); exit; end; |
Eigentlich sollten die beiden Versionen also genau das gleiche machen. :nixweiss:
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!