![]() |
Speicher (schnell) reservieren für ListenElemente ?
Ich habe ein Problem.
und zwar reserviere ich Speicher für ListenElemente einfach mit new.
Code:
das Funktioniert natürlich gut, nun mein Problem.
PBildtick = ^TBildTick;
TBildTick = record a, b, c, d : single; x : word; i : array [1..30] of single; next,back : PBildtick; end; die Größe des Array in diesem Record ist innerhalb der Laufzeit des Programms verschieden groß. Da das vorher nicht feststeht, reserviere ich einfach Platz für 30 Elemente. Und das ist schlecht :-( DasProblem dabei ist,wenn ich dynamische Arrays verwende, und dann bei jedem Listen Element mit setlength() die Array Größe setze, dann dauert das unakzeptabel lange und ist nicht mehr brauchbar für meinen Anwendungszweck.
Code:
PBildtick = ^TBildTick;
TBildTick = record a, b, c, d : single; x : word; i : array of single; next,back : PBildtick; end; Meine Idee wäre jetzt, im vorraus schon jedesmal 1000 Elemente der Liste zu reservieren, aber ich weiss nun nicht, wie ich das mit dem Dynamischen Array hinbekommen soll . Die Array Größe soll also 10 betragen, und nun möchte ich (so schnell wie möglich) mit einem Rutsch den Speicher für 1000 solcher Elemente reservieren. Ohne 1000 mal setlength zu benutzen. Ist das irgendwie möglich ? Danke ! |
Re: Speicher (schnell) reservieren für ListenElemente ?
Ich würde dir die Verwendung von TList empfehlen da du bei arrays ziemlich schnell an die grenzen stößt wenn du paar daten mehr darin speichern willst
|
Re: Speicher (schnell) reservieren für ListenElemente ?
Zitat:
|
Re: Speicher (schnell) reservieren für ListenElemente ?
Eigentlich hab ichs schon gelesen, aber anscheinend falsch verstanden?!
|
Re: Speicher (schnell) reservieren für ListenElemente ?
Vorher:
Delphi-Quellcode:
Var DasArray: Array of Irgendwas;
SetLength(DasArray, i); j := Length(DasArray); Nachher:
Delphi-Quellcode:
Var ArrayLength: Integer;
DasArray: Array of Irgendwas; Procedure SetLengthNew(L: Integer); Begin ArrayLength := L; If (L > Length(DasArray)) or (L < Length(DasArray) - 1000) Then SetLength(DasArray, (L div 1000 + 1) * 1000); End; SetLengthNew(i); j := ArrayLength; |
Re: Speicher (schnell) reservieren für ListenElemente ?
Hallo Himitsu,
das war zwar auch noch nicht, was ich wollte, aber der Blick auf Deinen Quelltext hat mich auf eine IDee gebracht. Die meine Sache löst ! .. wow .. cool ich kann dann einmal reservieren, entsprechend großen Platz, und kann dann jedem ListenElement den Zeiger zuordnen, und kann dann genauso wie auf ein normales Array zugreifen ! .. Danke, war zwar nicht direkt die Lösung, aber ohne Dich wäre ich nicht drauf gekommen ! :-) (hier der Code, wenn mein Array 5 Elemente haben soll und ich platz für 20 Array reservieren will. muss dann nur noch sauber berechnet werden, aber ich brauch nur einmal den ArraySpeicher reservieren.
Code:
procedure TForm1.Button1Click(Sender: TObject);
var a, p1, p2 : array of integer; i : integer; begin setlength(a,100); for i := 0 to 99 do a[i] := i; p1 := @a[0]; p2 := @a[4]; usw ... showmessage( inttostr(p1[1])); showmessage( inttostr(p2[1])); end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:07 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-2025 by Thomas Breitkreuz