Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Ärger mit Access violation
pigfacejoe - Mi 23.07.08 23:11
Titel: Ärger mit Access violation
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:
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
Narses: Topic aus Internet / Netzwerk verschoben am Mi 23.07.2008 um 23:43
Xentar - Mi 23.07.08 23:28
Zeig ma den Code von plusersetzen.
pigfacejoe - Mi 23.07.08 23:30
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 - 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.
http://www.google.de/index.html geht das dann?
Yogu - Mi 23.07.08 23:42
Der Fehler liegt genau in dieser Methode, und zwar da:
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:
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); dec(z, 4); end else inc(z, 1); end; result := s; end; |
Aber
Xentar hat schon Recht.
StringReplace ist eindeutig einfacher zu verwenden als eine selbst gebastelte Funktion.
Moderiert von
Narses: Delphi-Tag repariert
pigfacejoe - 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 - Mi 23.07.08 23:46
Yogu hat folgendes geschrieben: |
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); dec(z, 4); end else 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 - 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 - Do 24.07.08 00:04
Btw:
Wenn allesklein das macht, wonach es sich anhört: LowerCase ;)
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!