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 Fehler bei SetLength (https://www.delphipraxis.net/129475-fehler-bei-setlength.html)

peter314 19. Feb 2009 18:02


Fehler bei SetLength
 
Hallo allerseits,
ich scheine irgendetwas falsch zu machen, aber was, weiss ich nicht.
Der Fehler tritt bei mir eigentlich immer auf, wenn ich mit Setlength arbeite.
Beim dritten Durchlauf des Programms bekomme ich immer eine AccesViolation.

Delphi-Quellcode:
var
  Form1: TForm1;
  Punkt: Array of TPoint;
  s: string;                       //Formel
  Anzkoef: integer;                //Anzahl koeffizienten
  y: Array of real;
  koeffizient, exponent: Array of real;

procedure TForm1.Button1Click(Sender: TObject);
begin
  s:= Edit1.Text;
  nextsign(s);
  ListBox1.AddItem('f(x)='+Edit1.Text,Form1);
  Anzkoef:= findkoef(s);
  SetLength(Punkt, 600{Anzpunkte});
  SetLength(y,600);            {Hier tritt der Fehler auf. Wie gesagt immer beim dritten Mal}
  SetLength(koeffizient,Anzkoef);
  SetLength(exponent,Anzkoef);
  berechnen;
  zeichnen;
end;
Kann mir da irgendjemand helfen, dass geht mir nämlich langsam ziemlich auf den Keks.
Danke.

mkinzler 19. Feb 2009 18:07

Re: Fehler bei SetLength
 
Wenn bekannt ist, dass der Array 600 Elemente aufnehme musst, warum dann nicht statisch? Setzt du die Größe irgendwo zurück?

BackOrifice 19. Feb 2009 18:09

Re: Fehler bei SetLength
 
Sehe ich das richtig, dass der Speicher jedesmal allokiert und nie wieder freigegeben wird?

sirius 19. Feb 2009 18:19

Re: Fehler bei SetLength
 
Zitat:

Zitat von BackOrifice
Sehe ich das richtig, dass der Speicher jedesmal allokiert und nie wieder freigegeben wird?

Nö, das macht der Compiler schon am Ende der Methode.
Und ich würde die großen Arrays auch dynamisch belassen. Einfach um den Stack nicht zu überlasten.

Der Fehler muss woanders liegen.

himitsu 19. Feb 2009 18:20

Re: Fehler bei SetLength
 
SetLength ändert (nicht)vorhanden Speicher, also wenn schon was reserviert ist, dann wird nur die Größe angepaßt (also entweder speicher wird freigegeben, wenn Lenght kleiner wird, oder es wird sozusagen noch was reserviert, wenn Length größer wird)

(ja ich weiß, SetLength kopiert intern und So, aber ich wollt's einfacher erklären :angel2: )


was macht berechnen und zeichnen?
ich vermute da rin einfach mal einen Fehler.
PS: schalte mal die Bereichsprüfung (siehe Projektoptionen) ein.

mkinzler 19. Feb 2009 18:20

Re: Fehler bei SetLength
 
Zitat:

Nö, das macht der Compiler schon am Ende der Methode.
Bei globalen Variablen?

sirius 19. Feb 2009 18:21

Re: Fehler bei SetLength
 
Zitat:

Zitat von mkinzler
Zitat:

Nö, das macht der Compiler schon am Ende der Methode.
Bei globalen Variablen?

Upps, habe ich übersehen. :oops:
Dann eben so, wie himitsu sagt. :cyclops:

Dann würden statische Arrays aber auch nicht den Stack, sondern "nur" das Image der Datei belasten.

himitsu 19. Feb 2009 18:22

Re: Fehler bei SetLength
 
Zitat:

Zitat von mkinzler
Zitat:

Nö, das macht der Compiler schon am Ende der Methode.
Bei globalen Variablen?

da halt am Ende der Unit :stupid:

PS: hatte noch 'ne frage (für den Fragesteller) oben nachgetragen :mrgreen:

mkinzler 19. Feb 2009 18:23

Re: Fehler bei SetLength
 
Zitat:

Dann eben so, wie himitsu sagt. Cyclops
Aber nur wenn die Runtime genügend zusammenhängenden Speicher findet

peter314 19. Feb 2009 18:41

Re: Fehler bei SetLength
 
@mkinzler
Die 600 ist die Anzahl der Punkte die berechnet werden sollen die kann der Nutzer apäter irgendwann ändern.

@himitsu
Ich weiss leider nicht wo ich die Bereichsprüfung/Projektoptionen finde. Hab ne englische Version.

Delphi-Quellcode:
procedure TForm1.zeichnen;
begin
 Frame21.PaintBox1.Canvas.Pen.Color:= clred;
 Frame21.PaintBox1.Canvas.Polyline(Punkt);
end;
Für Berechnen erst einmal etwas zum Programm. Dieses soll Funktionsgraphen zeichnen. Der Nutzer gibt eine Funktioen ein (Edit1.Text) und berechnen Wertet diese Funktion aus. D.h. es bestimmt die koeffizienten und exponenten. Außerdem berechnet sie die y-koordinaten der Punkte.

Edit:
Hab die Bereichsprüfung jetzt gefunden und eingeschaltet. krieg jetzt in berechnen einen RangeCheckError
Passiert in einer For-Schleife. Wenn ich in den Compiler (glaub ich,str+F7) gehe ist der Wert der Laufvariable 42000 oder so dabei geht die Schleife von 0 to 0. ???

Edit2:
Fehler ist wieder verschwunden.


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:27 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