Autor Beitrag
pigfacejoe
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 332
Erhaltene Danke: 1

Win 10, Ubuntu
Delphi,Javascript, PHP, Java, Python
BeitragVerfasst: Mi 23.07.08 23:11 
Hallo!
Ich habe manchmal Programmabstürze wegen einer "access Violation" (Siehe Screenshot)
Ich suche schon den halben tag, wo der fehler liegt und habe herausgefunden , dass er sich in der markierten Zeile im Code befindet:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
procedure TForm5.Button1Click(Sender: TObject);
var z,i:integer;
begin
memo1:=Tstringlist.Create;
memo2:=Tstringlist.Create;
memo3:=Tstringlist.Create;
try
z:=1;
JVWaitingGradient1.Active:=true;
res:='';
text:='';
memo1.Text:=idhttp1.get('http://www.google.de/search?hl=deq='+plusersetzen(edit1.text)+'myvideo&btnG=Suche&meta=') ;
while z< length(memo1.text) do
begin

application.ProcessMessages;
...


Hat einer ne Idee? ich weiss nämlich echt nicht mehr weiter :cry:


Moderiert von user profile iconNarses: Topic aus Internet / Netzwerk verschoben am Mi 23.07.2008 um 23:43
Einloggen, um Attachments anzusehen!
Xentar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2077
Erhaltene Danke: 2

Win XP
Delphi 5 Ent., Delphi 2007 Prof
BeitragVerfasst: Mi 23.07.08 23:28 
Zeig ma den Code von plusersetzen.
pigfacejoe Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 332
Erhaltene Danke: 1

Win 10, Ubuntu
Delphi,Javascript, PHP, Java, Python
BeitragVerfasst: Mi 23.07.08 23:30 
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
function plusersetzen(s:string):string;
var z:integer;
begin
for z:= 1 to length(s) do
begin
if s[z]=' ' then s[z]:='+';
if (allesklein(copy (s,z,4))='.mp3') or (allesklein(copy (s,z,4))='.wma')or (allesklein(copy (s,z,4))='.wav') then delete(s,z,4);
end;
result:=s;
end;


Gruss
Max
Xentar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2077
Erhaltene Danke: 2

Win XP
Delphi 5 Ent., Delphi 2007 Prof
BeitragVerfasst: Mi 23.07.08 23:40 
Warum nimmst du nicht einfach StringReplace ?

Wenn du nur einen IdHHTTP.Get auf eine URL machst, die nicht so zusammengebastelt ist, also z.B. www.google.de/index.html geht das dann?
Yogu
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: Mi 23.07.08 23:42 
Der Fehler liegt genau in dieser Methode, und zwar da:

ausblenden Delphi-Quelltext
 
7:
{ ... }
if (allesklein(copy (s,z,4))='.mp3') or (allesklein(copy (s,z,4))='.wma')or (allesklein(copy (s,z,4))='.wav') then delete(s,z,4);

Du kannst nicht einfach den String verkürzen, wenn du ihn gerade in einer for-Schleife bearbeitest. Der String wird kürzer, die Schleife merkt nichts dafür, und - schwups - läuft die Laufvariable über den Rand des Strings hinaus. Für solche Anwendungen solltest du lieber zu einer while-Schleife wechseln:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
function plusersetzen(s: string): string;
var z: Integer;
begin
  z := 1;
  while z <= Length(s) do
  begin
    if s[z] = ' ' then s[z] := '+';
    if (allesklein(copy (s,z,4))='.mp3') or (allesklein(copy (s,z,4))='.wma') or (allesklein(copy (s,z,4))='.wav') then
    begin
      delete(s,z,4);
      // Um 4 dekrementieren, da so viele Zeichen eben gelöscht wurden
      dec(z, 4);
    end
    else
      // Wenn nicht, ein Zeichen weitergehen
      inc(z, 1);
  end;
  result := s;
end;


Aber user profile iconXentar hat schon Recht. StringReplace ist eindeutig einfacher zu verwenden als eine selbst gebastelte Funktion.

Moderiert von user profile iconNarses: Delphi-Tag repariert
pigfacejoe Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 332
Erhaltene Danke: 1

Win 10, Ubuntu
Delphi,Javascript, PHP, Java, Python
BeitragVerfasst: Mi 23.07.08 23:45 
Ja, den Quelltext lädt er bei anderen nicht zusammen gebastelten Seiten herunter. Un das komische ist: Ich benutze fast den selben Code um einen Songtext (hier ist es ein Video) herauszufiltern-Da klappt das ganz ohne Probleme. Aber ich werden mal die neue allesklein Funktion implementieren und schauen , was passiert.
Auch seltsam: Manchmal funktioniert das ganze auch ohne access violation....

Vielen Dank!
Gruss
Max
Xentar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2077
Erhaltene Danke: 2

Win XP
Delphi 5 Ent., Delphi 2007 Prof
BeitragVerfasst: Mi 23.07.08 23:46 
user profile iconYogu hat folgendes geschrieben:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
function plusersetzen(s: string): string;
var z: Integer;
begin
  z := 1;
  while z <= Length(s) do
  begin
    if s[z] = ' ' then s[z] := '+';
    if (allesklein(copy (s,z,4))='.mp3') or (allesklein(copy (s,z,4))='.wma') or (allesklein(copy (s,z,4))='.wav') then
    begin
      delete(s,z,4);
      // Um 4 dekrementieren, da so viele Zeichen eben gelöscht wurden
      dec(z, 4);
    end
    else
      // Wenn nicht, ein Zeichen weitergehen
      inc(z, 1);
  end;
  result := s;
end;


*grübel* hat das nicht den gleichen Effekt? Der Endwert der Schleife wird doch auch nur am Anfang einmal festgelegt.

Vorschläge:
1. Bei der For-Schleife bleiben, dann aber mit DownTo arbeiten
2. Auf While-Schleife umsteigen, dann aber den Endwert dekrementieren, statt die Zählvariable
3. StringReplace


Edit:
Äh, wieso jetzt neue allesklein Funktion? Um die gehts doch hier gar nicht ;)
Und wieso das manchmal geht, und mal nicht: Es leben die Speicherüberschreibungen :D Wenn am String 4 Zeichen gelöscht werden, läuft deine Schleife 4 Zeichen (also Byte) zu weit. Je nachdem was nun in diesem Speicher steht (ein Leerzeichen) wird der von dir wieder überschrieben - obwohl der Bereich gar nicht mehr zum String gehört. Je nachdem was das nun war können solch schöne Fehler entstehen :D
Schalt mal in den Compileroptionen die Bereichsprüfung ein, die sollte hier eigentlich anschlagen.
pigfacejoe Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 332
Erhaltene Danke: 1

Win 10, Ubuntu
Delphi,Javascript, PHP, Java, Python
BeitragVerfasst: Mi 23.07.08 23:55 
ich meinte natürlich die plusersetzen... allesklein is was anderes :oops:

Und: Bis jetzt keine Access Violation mehr...
Also Vielen Dank für eure Hilfe! ;-)
Xentar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2077
Erhaltene Danke: 2

Win XP
Delphi 5 Ent., Delphi 2007 Prof
BeitragVerfasst: Do 24.07.08 00:04 
Btw:
Wenn allesklein das macht, wonach es sich anhört: LowerCase ;)