AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Prism Speicher (schnell) reservieren für ListenElemente ?
Thema durchsuchen
Ansicht
Themen-Optionen

Speicher (schnell) reservieren für ListenElemente ?

Ein Thema von stoxx · begonnen am 5. Mär 2004 · letzter Beitrag vom 5. Mär 2004
Antwort Antwort
Benutzerbild von stoxx
stoxx

Registriert seit: 13. Aug 2003
1.111 Beiträge
 
#1

Speicher (schnell) reservieren für ListenElemente ?

  Alt 5. Mär 2004, 20:06
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 !
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#2

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

  Alt 5. Mär 2004, 20:51
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
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von stoxx
stoxx

Registriert seit: 13. Aug 2003
1.111 Beiträge
 
#3

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

  Alt 5. Mär 2004, 20:57
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.
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#4

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

  Alt 5. Mär 2004, 21:09
Eigentlich hab ichs schon gelesen, aber anscheinend falsch verstanden?!
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

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

  Alt 5. Mär 2004, 21:33
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;
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 stoxx
stoxx

Registriert seit: 13. Aug 2003
1.111 Beiträge
 
#6

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

  Alt 5. Mär 2004, 22:36
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;
  Mit Zitat antworten Zitat
Antwort Antwort


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 19:43 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