Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Prism Speicher (schnell) reservieren für ListenElemente ? (https://www.delphipraxis.net/17458-speicher-schnell-reservieren-fuer-listenelemente.html)

stoxx 5. Mär 2004 20:06


Speicher (schnell) reservieren für ListenElemente ?
 
Ich habe ein Problem.
und zwar reserviere ich Speicher für ListenElemente einfach mit new.

Code:
PBildtick = ^TBildTick;
 TBildTick = record
  a, b, c, d : single;
  x : word;
  i : array [1..30] of single;
  next,back : PBildtick;
end;
das Funktioniert natürlich gut, nun mein Problem.

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 !

SirThornberry 5. Mär 2004 20:51

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

stoxx 5. Mär 2004 20:57

Re: Speicher (schnell) reservieren für ListenElemente ?
 
Zitat:

Zitat von SirThornberry
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

Du hast mein Posting leider nicht gelesen.

SirThornberry 5. Mär 2004 21:09

Re: Speicher (schnell) reservieren für ListenElemente ?
 
Eigentlich hab ichs schon gelesen, aber anscheinend falsch verstanden?!

himitsu 5. Mär 2004 21:33

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;

stoxx 5. Mär 2004 22:36

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