AGB  ·  Datenschutz  ·  Impressum  







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

Maximale Arraylänge?

Ein Thema von Delphi-Narr · begonnen am 26. Sep 2010 · letzter Beitrag vom 27. Sep 2010
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Delphi-Narr
Delphi-Narr

Registriert seit: 29. Aug 2009
Ort: Duisburg
437 Beiträge
 
Delphi 2007 Professional
 
#1

Maximale Arraylänge?

  Alt 26. Sep 2010, 11:40
Delphi-Version: 5
Hallo, ich habe mir eine eigene Komponente erstellt: Einen Graphen. Man kann zwischen runder Kurve und Punktgenauen Linien unterscheiden. Als Quelle für die Punkte gibt es einen Klasse:


Delphi-Quellcode:
TValues=array of real;

private
    XV:TValues;
    YV:TValues;


Wenn ich jetzt die Y-Werte auffülle (Also erst die Länge der Arrays festlege und dann die Werte eintrage) und das ganze auch mit den X-Werten mache, habe ich schonmal meine Wertetabelle. Das Ganze wird auch ordnungsgemäß aufgezeichnet.
Doch ab einer bestimmten Arraylänge klappt das nicht mehr.
Wenn ich jeweils (Für XV und YV) jeweils von 0 bis 198 eintrage (also 199 Werte) klappt es. Doch bei 200 nicht mehr. Warum???

Viele Grüße!

Geändert von mkinzler (26. Sep 2010 um 11:43 Uhr) Grund: Delphi-Tag eingefügt
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

AW: Maximale Arraylänge?

  Alt 26. Sep 2010, 11:44
Was heißt "klappt nicht mehr"? Fehlermeldung? Programmabsturz? Und wie sieht dein Code aus? Die Arraygröße ist nur durch den Datentyp des Indexes und dem größten freien Speicherbereich begrenzt.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Maximale Arraylänge?

  Alt 26. Sep 2010, 11:45
Die Grenze sollten die Größe des größten Verfügbaren Speicherbereichs sein.
Warum speicherst du X und Y Werte getrennt man könnte dafür ja auch einen Record deklarieren.

Btw.:
Warum weigerst du es, Tags für deinen Quellcode zu verwenden?
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von Delphi-Narr
Delphi-Narr

Registriert seit: 29. Aug 2009
Ort: Duisburg
437 Beiträge
 
Delphi 2007 Professional
 
#4

AW: Maximale Arraylänge?

  Alt 26. Sep 2010, 11:52
Es kommt weder Fehlermeldung noch Absturz. Der Graph wird einfach nicht mehr gezeichnet. Nur die Achsen sind noch sichtbar...

Hier der Aufruf, um zu malen

Delphi-Quellcode:
var i:integer;
begin
     randomize;
     for i:=0 to 198 do
     begin
     G1.XValues[i]:=-400+4*i;
     G1.YValues[i]:=Random(599)-300;
     end;
     G1.Redraw;
end;
Es werden die Werte 0 bis 198 zufällig eingetragen (zumindest y) und der Graph wird neu gezeichnet. Dieser aufruf klappt, dich wenn man die 198 durch 199 ersetzt, klappt es nicht mehr... Arraylänge wird vorher angepasst.


Hier die Prozedur "Redraw" Sorry für formatierung, ist nur kopiert...

Delphi-Quellcode:
procedure TLbGraph.Redraw(Delete:Boolean=True);
var i,l,X,Y,dX,dY:integer;
    Ps:Array of TPoint;
    Pt:TPoint;
    XA,YA:Boolean; //Achsen zeichnen???
begin
     SetLength(Ps,0);
     if (Length(XV)=0) or (Length(YV)=0) then exit;

     if Length(XV)>Length(YV) then l:=Length(YV) else l:=Length(XV); //den kürzeren Array nehmen



     
     SetLength(PS,l);

     for i:=0 to l-1 do
     begin
          PS[i]:=XYtoPixels(XV[i],YV[i]);
     end;

     
     if Delete then G.canvas.FillRect(Rect(0,0,width,height));


     XA:=False;
     YA:=False;

     Pt:=XYToPixels(0,0);
     if (PT.x>30) and (Pt.x<width-30) then
     begin
          x:=Pt.x;
          YA:=True;
     end
     else
     x:=10;

     if (PT.y>30) and (Pt.y<height-30) then
     begin
          y:=Pt.y;
          XA:=True;
     end
     else y:=height-30;

     if XA then
     begin
          G.canvas.pen.color:=clblack;
          //XAchse malen
          G.canvas.MoveTo(-1,Y);
          G.canvas.LineTo(width+1,y);

          i:=10;
          while i<width-40 do
                begin
                     G.canvas.Font.size:=5;
                     if (i<x-20) or (i>x+20) then G.canvas.TextOut(i,Y-10,FloatToStrf(PixelsToXY(i,i).x,fffixed,10,2));
                     i:=i+50;
                end;
     end;

     if YA then
     begin
          G.canvas.pen.color:=clblack;
          //YAchse malen
          G.canvas.MoveTo(X,-1);
          G.canvas.LineTo(X,height+1);
          i:=10;
          while i<height-40 do
                begin

                     G.canvas.Font.size:=5;
                     if (i<y-20) or (i>y+20) then G.canvas.TextOut(X+10,i,FloatToStrf(PixelsToXY(i,i).y,fffixed,10,2));
                     i:=i+50;
                end;
     end;

     G.Canvas.pen.color:=clgray;

     if not XA then
     begin
          i:=10;
          while i<width-40 do
                begin
                     G.canvas.Font.size:=5;
                     if (i<x-20) or (i>x+20) then G.canvas.TextOut(i,y,FloatToStrf(PixelsToXY(i,i).x,fffixed,10,2));
                     i:=i+50;
                end;
     end;

     if not YA then
     begin
          i:=10;
          while i<height-40 do
                begin
                     G.canvas.Font.size:=5;
                     if (i<y-20) or (i>y+20) then G.canvas.TextOut(x,i,FloatToStrf(PixelsToXY(i,i).y,fffixed,10,2));
                     i:=i+50;
                end;
     end;

     //Graphen zeichnen
     if GraphKind=gkstraight then
     begin
          G.canvas.pen.color:=clred;
          G.canvas.Polyline(Ps);
     end
     else

     if GraphKind=gkrounded then
     begin
          G.canvas.pen.color:=clred;
          G.canvas.Polybezier(Ps);
     end;
end;
ist noch recht provisorisch, aber prinzipiell klappt es.
Viele Grüße!


Edit: Ich habe diesen Record auch schon erstellt. Ich habe mir nur noch nicht überlegt, wie der Nutzer die Werte dann eintragen kann. Darum getrennt. Die Tags hab ich oben nur vergessen
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 15. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#5

AW: Maximale Arraylänge?

  Alt 26. Sep 2010, 12:17
Ist Dir schon mal aufgefallen, dass dein Sourcecode nur so von Zahlen wimmelt?
Hier ein Beispiel:
Delphi-Quellcode:
 i:=10 {<=};
          while i<width-40{<=} do
                begin
                     G.canvas.Font.size:=5{<=};
                     if (i<x-20{<=}) or (i>x+20{<=}) then G.canvas.TextOut(i,Y-10{<=},FloatToStrf(PixelsToXY(i,i).x,fffixed,10,2));
                     i:=i+50{<=};
                end;
Das führt natürlich zu einer schlechten Codequalität.
Ersetze mal alle diese Zahlen durch Konstanten.
Manche Zahlen sollten sogar durch Variablen ersetzt werden.
Anstatt die Achsen-Beschriftung mit fester Schrittgrösse 5 zu zeichnen,
wäre es doch besser den Font (inkl. Name, Style,...) von aussen vorzugeben.
  Mit Zitat antworten Zitat
Benutzerbild von Delphi-Narr
Delphi-Narr

Registriert seit: 29. Aug 2009
Ort: Duisburg
437 Beiträge
 
Delphi 2007 Professional
 
#6

AW: Maximale Arraylänge?

  Alt 26. Sep 2010, 12:23
Wie gesagt, das ist noch ein Provisorium. Aber die Achsen werden immer ordnungsgemäß gezeichnet. Auch bei Arraylänge über 199.
Außerdem ist es doch egal ob ich 10 oder Randabstand hinschreibe. Nur wenn der Abstand geändert werden soll, muss ich halt 4 Zeilen ändern statt einer.
Daran kanns aber nicht liegen.

Viele Grüße!
  Mit Zitat antworten Zitat
Satty67

Registriert seit: 24. Feb 2007
Ort: Baden
1.566 Beiträge
 
Delphi 2007 Professional
 
#7

AW: Maximale Arraylänge?

  Alt 26. Sep 2010, 12:26
Der für das Problem relevante Teil mal etwas freigestellt:
Delphi-Quellcode:
     SetLength(PS,l);

     for i:=0 to l-1 do
     begin
          PS[i]:=XYtoPixels(XV[i],YV[i]);
     end;

     [...]

     //Graphen zeichnen
     if GraphKind=gkstraight then
     begin
          G.canvas.pen.color:=clred;
          G.canvas.Polyline(Ps);
     end
     else

     if GraphKind=gkrounded then
     begin
          G.canvas.pen.color:=clred;
          G.canvas.Polybezier(Ps);
     end;
Da erkenne ich jetzt kein Fehler, das Polyline eine Obergrenze an hat, ist mir auch nicht bekannt.

Bei SetLength mal einen Breakpoint setzen und auch die Größe von XV/YV testen. Wenn die schon bei 199 Werten stehen bleiben, die Zuweisung dort prüfen (Der Code fehlt leider).

PS: Zeigen die Setter X/YValues direkt auf ein Array oder gibt es eine SetFunktion?

Geändert von Satty67 (26. Sep 2010 um 12:29 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Maximale Arraylänge?

  Alt 26. Sep 2010, 12:27
Die Grenze sollten die Größe des größten Verfügbaren Speicherbereichs sein.
rein theoretisch ist die größe maximal ($7FFFFFFF - 8) div SizeOf(arr[0]) Felder,
aber praktisch ist die größe auf den größten zusammenhängenden freien Speicherbereich im virtuellen Speicher der Anwendung und auf den maximalen freien Speicher im physischen Arbeitsspeicher (RAM + Pagefile) begrenzt.

Wenn es also bei diesen läppischen 1800 Byte (200 * SizeOf(Real)) schon knallt, dann ist entweder der virtuelle Speicher deiner Anwendungs hoffnungslos überfüllt und du kannst froh sein, daß die Anwendung überhaupt bit dahin gelaufen ist
oder du solltest nach anderen Ursachen suchen, wie
- fehlerhafte Pointer
- Speicherlecks
- Pufferüberläufe
- falsche Indize


Als erstes empfehle ich einfach mal die Index- und die Bereichsprüfung in den Projektoptionen zu aktivieren und dann auch mal FastMM zu installieren und nach Speicherlecks zu suchen und/oder ein anderes Speicherüberwachungstoll zu verwenden.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#9

AW: Maximale Arraylänge?

  Alt 26. Sep 2010, 12:28
Was ist, wenn das G1 einfach nicht mehr als 199 Werte aufnehmen kann? Was ist das überhaupt?

Außerdem könnten auch die Zahlen da Probleme machen, dass du irgendwo unabsichtlich was abschneidest. Auch sollten mindestens 200 real-Werte verfügbar sein. Ich würde da einfach erst mal kürzen.

MfG
Fabian
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat
Benutzerbild von Matze
Matze
(Co-Admin)

Registriert seit: 7. Jul 2003
Ort: Schwabenländle
14.929 Beiträge
 
Turbo Delphi für Win32
 
#10

AW: Maximale Arraylänge?

  Alt 26. Sep 2010, 12:29
Anstelle des Datentype "Real" würde ich persönlich übrigens "Double" nutzen.
Intern ist der Datentyp identisch:
Delphi-Quellcode:
// Quelle: http://docwiki.embarcadero.com/VCL/en/System.Double
type Real = Double;
Ich habe den Eindruck, "Real" gibt es nur noch aus Kompatibilitätsgründen.
  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 05:55 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