Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Probleme mit SetLength (https://www.delphipraxis.net/129803-probleme-mit-setlength.html)

bumpelwumpel 25. Feb 2009 22:49


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:

Zugriffsverletzung bei Adresse 004570ED in Modul 'Projekt 1.exe'. Lesen von Adresse 000000000
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;

himitsu 25. Feb 2009 22:56

Re: Probleme mit SetLength
 
Zitat:

doch das Programm stürtz mir immer mit deiser Fehlermeldung ab:
und in welcher Programmzeile geschieht da?



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:

Delphi-Quellcode:
if ((output[1]='>') and (output[2]='>'))=true then

ist in output etwas/genug drin?
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

bumpelwumpel 26. Feb 2009 10:25

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.

Klaus01 26. Feb 2009 10:46

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:

Zitat von DelphiHilfe
procedure Delete(var S: string; Index, Count:Integer);

Description

Delete removes a substring of Count characters from string S starting with S[Index]. S is a string-type variable. Index and Count are integer-type expressions.

If index is larger than the length of the S or less than 1, no characters are deleted.

If count specifies more characters than remain starting at the index, Delete removes the rest of the string. If count is less than 0, no characters are deleted.

Grüße
Klaus

bumpelwumpel 26. Feb 2009 10:54

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));

taaktaak 26. Feb 2009 10:57

Re: Probleme mit SetLength
 
Zitat:

dann löscht sie etwas
... und was? Zu viel? Zu wenig?

Bbommel 26. Feb 2009 11:08

Re: Probleme mit SetLength
 
Zitat:

Zitat von bumpelwumpel
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.

Setze doch mal einen Haltepunkt in der Zeile, in der "Delete(output,1,2);" vorkommt, also bevor in diesem if-Fall etwas ausgeführt wird. Und dann fragst du mal im Debugger die Ausdrücke "Output" und "StartInt" ab - welche Werte haben die denn?

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

quantum 26. Feb 2009 12:56

Re: Probleme mit SetLength
 
So wie ich das sehe, kann es garnicht funtionieren.
Delphi-Quellcode:
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!!! 
    ...
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 ;-).

Bbommel 26. Feb 2009 13:21

Re: Probleme mit SetLength
 
Zitat:

Zitat von quantum
So wie ich das sehe, kann es garnicht funtionieren.

[...]
Laut OP tritt das Problem allerdings ja in der anderen if-Bedingung auf, also nicht bei
Delphi-Quellcode:
SetLength(Start, counter1-1);
sondern bei
Delphi-Quellcode:
SetLength(output, StartInt);
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:
Zitat:

Zitat von quantum
Delphi-Quellcode:
  if Points[Line][counter1]='-' then

Denn Points[Line][0] ist zwar murks, sollte aber eigentlich nicht gleich "-" werden.

Bis denn
Bommel

quantum 26. Feb 2009 13:54

Re: Probleme mit SetLength
 
Zitat:

Zitat von Bbommel
Laut OP tritt das Problem allerdings ja in der anderen if-Bedingung auf, also nicht bei
Delphi-Quellcode:
SetLength(Start, counter1-1);
sondern bei
Delphi-Quellcode:
SetLength(output, StartInt);

Ja das sieht auch "murksisch" aus :-)
Delphi-Quellcode:
Delete(output,1,2);          <--- 2 Zeichen löschen
SetLength(output, StartInt); <--- stimmt jetzt StartInt noch, da im String 2 Zeichen fehlen?
Und ist StartInt überhaupt irgendwo initialisiert?

Zitat:

Zitat von Bbommel
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:
Zitat:

Zitat von quantum
Delphi-Quellcode:
  if Points[Line][counter1]='-' then

Denn Points[Line][0] ist zwar murks, sollte aber eigentlich nicht gleich "-" werden.

Es wird dennoch beim ersten mal auf Points[Line][0] zugegriffen. Was der Code danach tut, möchte ich lieber nicht wissen ;-)
Delphi-Quellcode:
for counter1 := 0 to Length(Points[Line])-1 do
sollte mal durch
Delphi-Quellcode:
for counter1 := 1 to Length(Points[Line])-1 do
ersetzt werden.

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 05:21 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz