AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Probleme mit SetLength

Ein Thema von bumpelwumpel · begonnen am 25. Feb 2009 · letzter Beitrag vom 26. Feb 2009
Antwort Antwort
Seite 1 von 2  1 2      
bumpelwumpel

Registriert seit: 19. Feb 2009
8 Beiträge
 
#1

Probleme mit SetLength

  Alt 25. Feb 2009, 22:49
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;
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.139 Beiträge
 
Delphi 12 Athens
 
#2

Re: Probleme mit SetLength

  Alt 25. Feb 2009, 22:56
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

schalt mal deine Bereichsprüfung (siehe Projectoptionen) ein, dann siehst'es eventuell




Zitat:
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
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
bumpelwumpel

Registriert seit: 19. Feb 2009
8 Beiträge
 
#3

Re: Probleme mit SetLength

  Alt 26. Feb 2009, 10:25
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.
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.755 Beiträge
 
Delphi 10.4 Sydney
 
#4

Re: Probleme mit SetLength

  Alt 26. Feb 2009, 10:46
Hallo,

mal eine kleine Frage, warum willst Du den String mit SetLength kürzen.

Du könntest auch die Prozedur delete nehmen.
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
Klaus
  Mit Zitat antworten Zitat
bumpelwumpel

Registriert seit: 19. Feb 2009
8 Beiträge
 
#5

Re: Probleme mit SetLength

  Alt 26. Feb 2009, 10:54
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.
Delete(output,StartP,Length(output));
  Mit Zitat antworten Zitat
taaktaak

Registriert seit: 25. Okt 2007
Ort: Radbruch
1.990 Beiträge
 
Delphi 7 Professional
 
#6

Re: Probleme mit SetLength

  Alt 26. Feb 2009, 10:57
Zitat:
dann löscht sie etwas
... und was? Zu viel? Zu wenig?
Ralph
  Mit Zitat antworten Zitat
Bbommel

Registriert seit: 27. Jun 2007
Ort: Köln
652 Beiträge
 
Delphi 12 Athens
 
#7

Re: Probleme mit SetLength

  Alt 26. Feb 2009, 11:08
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
  Mit Zitat antworten Zitat
quantum

Registriert seit: 15. Apr 2006
Ort: Kassel
64 Beiträge
 
Delphi XE Professional
 
#8

Re: Probleme mit SetLength

  Alt 26. Feb 2009, 12:56
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 .
  Mit Zitat antworten Zitat
Bbommel

Registriert seit: 27. Jun 2007
Ort: Köln
652 Beiträge
 
Delphi 12 Athens
 
#9

Re: Probleme mit SetLength

  Alt 26. Feb 2009, 13:21
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
SetLength(Start, counter1-1); sondern bei
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 von quantum:
  if Points[Line][counter1]='-then
Denn Points[Line][0] ist zwar murks, sollte aber eigentlich nicht gleich "-" werden.

Bis denn
Bommel
  Mit Zitat antworten Zitat
quantum

Registriert seit: 15. Apr 2006
Ort: Kassel
64 Beiträge
 
Delphi XE Professional
 
#10

Re: Probleme mit SetLength

  Alt 26. Feb 2009, 13:54
Zitat von Bbommel:
Laut OP tritt das Problem allerdings ja in der anderen if-Bedingung auf, also nicht bei
SetLength(Start, counter1-1); sondern bei
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 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 von quantum:
  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
for counter1 := 0 to Length(Points[Line])-1 do sollte mal durch
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.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:09 Uhr.
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