![]() |
Probleme mit SetLength
Hi,
ich habe ein Problem. Die Funktion SetLength funktiniert bei mir nicht richtig. Mit SetLength will ich einen String (output) kürzen. Und zwar um den Wert "StartInt". Dieser setzt sich aus einem String zusammen, der in etwas so aussieht "30-35". Also suche ich nach dem "-", und benutzt dann nur noch die "30". Die wandle ich in einen Integer um. Das sollte dann die Länge meines Strings sein, doch das Programm stürtz mir immer mit deiser Fehlermeldung ab: Zitat:
Delphi-Quellcode:
begin
output:=Textfile.strings[Line]; for counter1 := 0 to Length(Points[Line])-1 do begin if Points[Line][counter1]='-' then begin Start:=Points[Line]; SetLength(Start, counter1-1); StartInt:=StrToInt(Start); end; if ((output[1]='>') and (output[2]='>'))=true then begin Delete(output,1,2); SetLength(output, StartInt); ListBox1.Items.Add(output); end; |
Re: Probleme mit SetLength
Zitat:
bei dir ist wohl eher die Schleife davor kaputt Strings werden von 1 bis Length indiziert :warn: schalt mal deine Bereichsprüfung (siehe Projectoptionen) ein, dann siehst'es eventuell Zitat:
wenn output leer ist, dann kommt es da auch zu dieser Fehlermeldung ach ja [dp]prüfe nie auf =true[/dp]
Delphi-Quellcode:
if (output[1]='>') and (output[2]='>') then
// besser if (Length(output)>=2) and (output[1]='>') and (output[2]='>') then // oder notfalls nur if copy(output,1,2) = '>>' then |
Re: Probleme mit SetLength
Ich hab das mit den if bedingungen geändert. Danke.
Das Problem tritt bei "SetLength(output, StartInt);" auf. Wenn ich diese Zeile weglasse, dann funktioniert es. Und in output ist mit sicherheit etwas gespeichert. Denn output wird ja ohne diese Zeile korrekt ausgegeben. |
Re: Probleme mit SetLength
Hallo,
mal eine kleine Frage, warum willst Du den String mit SetLength kürzen. Du könntest auch die Prozedur delete nehmen. Zitat:
Klaus |
Re: Probleme mit SetLength
Das geht auch nicht. Wenn ich die Zahlen manuell in die Delete Funktion einfüge, dann löscht sie etwas.
Und StartP ist immer mit der richtigen Zahl belegt.
Delphi-Quellcode:
Delete(output,StartP,Length(output));
|
Re: Probleme mit SetLength
Zitat:
|
Re: Probleme mit SetLength
Zitat:
Vor allem solltest du dabei auch testen, ob das Programm bei jedem Schleifendurchlauf abstürzt oder nur bei einem bestimmten. Interessant sind dann obige Werte natürlich nur für diesen bestimmten Durchlauf. Vor allem solltest du dann auch mal Schritt-für-Schritt durchgehen (F8 drücken) und schauen, bei welcher Zeile die Zugriffsverletzung wirklich auftritt. Bis denn Bommel |
Re: Probleme mit SetLength
So wie ich das sehe, kann es garnicht funtionieren.
Delphi-Quellcode:
Außerdem solltest du Points[Line] vor dem for-loop einer lokalen Variablen übergeben und diese innerhalb des for-loops benutzen, sonst wird es arschlangsam und zeichnet einen schlecht riechenden Code aus ;-).
for counter1 := 0 to Length(Points[Line])-1 do
begin if Points[Line][counter1]='-' then begin Start:=Points[Line]; SetLength(Start, counter1-1); <--- counter1 = 0 | 0 - 1 = -1 -> SetLength(Start, -1); <-- BOOOM!!! ... |
Re: Probleme mit SetLength
Zitat:
Laut OP tritt das Problem allerdings ja in der anderen if-Bedingung auf, also nicht bei
Delphi-Quellcode:
sondern bei
SetLength(Start, counter1-1);
Delphi-Quellcode:
Wobei natürlich auch das von dir zitierte problematisch ist, aber eigentlich sollte er für den Fall von counter1=0 schon an dieser if-Bedingung scheitern:
SetLength(output, StartInt);
Zitat:
Bis denn Bommel |
Re: Probleme mit SetLength
Zitat:
Delphi-Quellcode:
Und ist StartInt überhaupt irgendwo initialisiert?
Delete(output,1,2); <--- 2 Zeichen löschen
SetLength(output, StartInt); <--- stimmt jetzt StartInt noch, da im String 2 Zeichen fehlen? Zitat:
Delphi-Quellcode:
sollte mal durch
for counter1 := 0 to Length(Points[Line])-1 do
Delphi-Quellcode:
ersetzt werden.
for counter1 := 1 to Length(Points[Line])-1 do
Meiner Meinung nach gibt es in dem Code eine Vielzahl von potentiellen Grenzüberschreitungen. Der Range-Check sollte mal in den Compiler-Options aktiviert werden, dann kann der Debugger gleich zum Murks springen. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:00 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz