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 //hier entsteht wohl der fehler
     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 //hier entsteht wohl der fehler                    

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 //hier liegt wahrscheinlich der fehler
    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

user profile iconthe-kecks hat folgendes geschrieben Zum zitierten Posting springen:

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

user profile iconthe-kecks hat folgendes geschrieben Zum zitierten Posting springen:
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

user profile iconthe-kecks hat folgendes geschrieben Zum zitierten Posting springen:
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

user profile iconthe-kecks hat folgendes geschrieben Zum zitierten Posting springen:
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 //hier liegt wahrscheinlich der fehler
    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 //added
    if pos(str, filetxt[i2]) >0 then
     begin
       antwort:=edit2.text;
     end
       else
       begin
        antwort:='NG';
       end;
    end;
   end//added
 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 //hier liegt wahrscheinlich der fehler
      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 //added
      if pos(str, filetxt[i2]) >0 then
      begin
        antwort:=edit2.text;
      end
      else
      begin
        antwort:='NG';
      end// if Pos
    end
  end//added
end
else
begin
  showmessage('Datei wurde nicht gefunden!');
  exit;
end;
Eigentlich sollten die beiden Versionen also genau das gleiche machen. :nixweiss: