| Autor |
Beitrag |
pigfacejoe
      
Beiträge: 332
Erhaltene Danke: 1
Win 10, Ubuntu
Delphi,Javascript, PHP, Java, Python
|
Verfasst: 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:
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
Einloggen, um Attachments anzusehen!
|
|
Xentar
      
Beiträge: 2077
Erhaltene Danke: 2
Win XP
Delphi 5 Ent., Delphi 2007 Prof
|
Verfasst: Mi 23.07.08 23:28
Zeig ma den Code von plusersetzen.
|
|
pigfacejoe 
      
Beiträge: 332
Erhaltene Danke: 1
Win 10, Ubuntu
Delphi,Javascript, PHP, Java, Python
|
Verfasst: 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
      
Beiträge: 2077
Erhaltene Danke: 2
Win XP
Delphi 5 Ent., Delphi 2007 Prof
|
Verfasst: 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
      
Beiträge: 2598
Erhaltene Danke: 156
Ubuntu 13.04, Win 7
C# (VS 2013)
|
Verfasst: 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 
      
Beiträge: 332
Erhaltene Danke: 1
Win 10, Ubuntu
Delphi,Javascript, PHP, Java, Python
|
Verfasst: 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
      
Beiträge: 2077
Erhaltene Danke: 2
Win XP
Delphi 5 Ent., Delphi 2007 Prof
|
Verfasst: 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  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
Schalt mal in den Compileroptionen die Bereichsprüfung ein, die sollte hier eigentlich anschlagen.
|
|
pigfacejoe 
      
Beiträge: 332
Erhaltene Danke: 1
Win 10, Ubuntu
Delphi,Javascript, PHP, Java, Python
|
Verfasst: Mi 23.07.08 23:55
ich meinte natürlich die plusersetzen... allesklein is was anderes
Und: Bis jetzt keine Access Violation mehr...
Also Vielen Dank für eure Hilfe! 
|
|
Xentar
      
Beiträge: 2077
Erhaltene Danke: 2
Win XP
Delphi 5 Ent., Delphi 2007 Prof
|
Verfasst: Do 24.07.08 00:04
Btw:
Wenn allesklein das macht, wonach es sich anhört: LowerCase 
|
|
|