Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Arrays, dynamisch-->statisch (https://www.delphipraxis.net/46900-arrays-dynamisch-statisch.html)

Majortomster 2. Jun 2005 17:07


Arrays, dynamisch-->statisch
 
Hallo,

wie kann ich ein dynamisches Array erstellen, dessen Größe aber erst zur Laufzeit feststeht?

Andere Möglichkeit, die mein Problem auch lösen würde: Eine Möglichkeit, ein dynamisches Array in ein statisches umzuwandeln.
´
Ich brauche unbedingt ein statisches Array, denn die Methode TCustomClientDataSet.FindKey akzeptiert NUR ein statisches...

Hat jemand eine Idee?
Wäre nett...

Gruß,
Thomas

barf00s 2. Jun 2005 17:09

Re: Arrays, dynamisch-->statisch
 
statisches array kannst mit

Delphi-Quellcode:
type
  TArray = array of integer;

var
  aInteger: TArray;

begin
  SetLength(aInteger, 100); // 100 elemente festlegen
end;
festlegen...

öhm


dynamisch zu statisch würde mit "Move" wunderbar klappen

Delphi-Quellcode:
Move(Pointer(aStatic)^, Pointer(aDynamic)^, iStaticArrayElementCount * SizeOf(aStatic[0]));

Muetze1 2. Jun 2005 17:10

Re: Arrays, dynamisch-->statisch
 
Moin!

Zitat:

Zitat von Majortomster
Ich brauche unbedingt ein statisches Array, denn die Methode TCustomClientDataSet.FindKey akzeptiert NUR ein statisches...

Wie kommst du darauf?

Zitat:

Zitat von barf00s
statisches array kannst mit

Delphi-Quellcode:
type
  TArray = array of integer;

var
  aInteger: TArray;

begin
  SetLength(aInteger, 100); // 100 elemente festlegen
end;

Das ist ein dynamisches, kein statisches!

MfG
Muetze1

/EDIT: Wieder keine Meldung!

Phistev 2. Jun 2005 17:21

Re: Arrays, dynamisch-->statisch
 
SetLength akzeptiert auch als zweiten Parameter (wie jede Funktion) das Ergenis einer anderen Funktion oder den Wert einer Variablen, also:
Delphi-Quellcode:
var groesse: integer;
//Größe berechnen
SetLength(aInteger, groesse);
Ein statisches Array deklariert man übrigens als:
Delphi-Quellcode:
type TIntArray: array[0..100] of integer
Statt Zahlen können auch Konstanten verwendet werden, aber keine Variablen. Zur Umwandlung: Wenn dir move zu unsicher ist, tut's auch eine for-Schleife:
Delphi-Quellcode:
i:=0
for loop:= low(dynarray) to high(dynarray) do begin
  statarray[i+Untergrenze]:=dynarray[loop]; //für Konstruktionen wie array[10..200]
  inc(i);
end;

alzaimar 2. Jun 2005 22:03

Re: Arrays, dynamisch-->statisch
 
Zitat:

Ich brauche unbedingt ein statisches Array, denn die Methode TCustomClientDataSet.FindKey akzeptiert NUR ein statisches...
Oh oh, mich dünkt, ich hatte mal ein ähnliches Problem und konnte nur nur dadurch helfen, indem ich das FindKey neu geschrieben habe. Es ist ja im Grunde genommen nur eine art Filter: Du scanst alle Datensätze durch, bis der Datensatz dem Array Of Const entspricht. So schwer ist das doch nicht:
Delphi-Quellcode:
Function MyFindKey (aDataset : TDataset; aFields : Array Of String; aValues : Array Of Variant) : Boolean;
Var
  i : Integer;

Begin
  While not aDataset.eof do begin
    i := Low (aFields);
    Result := True;
    While Found and (i <= High (aFields)) do
      If aDataset [aFields[i]] <> aValues[i] Then
        Result := False;
    If Result Then
      Exit;
    aDataSet.Next;
    end;
  Result := False
End;
So, oder ähnlich sollte es klappen. Performance sollte akzeptabel sein.

barf00s 3. Jun 2005 08:58

Re: Arrays, dynamisch-->statisch
 
@phistev, mütze .... wiederholt ihr immer die antwort des vorgängers???

Muetze1 3. Jun 2005 14:03

Re: Arrays, dynamisch-->statisch
 
Moin!

Zitat:

Zitat von barf00s
@phistev, mütze .... wiederholt ihr immer die antwort des vorgängers???

Probleme damit, weil ich behaupte das du uns ein dynamisches Array als statisches verkaufen willst? Oder einfach nur schlecht geschlafen?

MfG
Muetze1

barf00s 3. Jun 2005 14:13

Re: Arrays, dynamisch-->statisch
 
ich sehs grad ^^ hab mich ja tatsächlich verschrieben :)
ich nehm alles zurück, schulligung nommel

Majortomster 3. Jun 2005 15:08

Re: Arrays, dynamisch-->statisch
 
Danke für die vielen Tipps, aber all dies löst mein Problem leider nicht.
Im Einzelnen:
1. Wenn ich SetLength() auf ein dynamisches Array anwende, dann wird es trotzdem nicht zu einem statischen --> unbrauchbar für FindKey()
2. Move-Funktion --> kopiert doch nur Bytes von einem Speicherbereich in einen anderen, damit könnte ich das statische Array zwar füllen, dies löst aber nicht das Problem, wie ich dieses Array denn erstmal "erschaffen" soll (wie gesagt, dessen Größe steht erst zu Laufzeit fest)
3. in for-schleife das statische Array füllen --> siehe Punkt 2.
4. Eigene FindKey-Methode schreiben --> Möglich, aber dann könnte ich auch gleich die Locate-Methode benutzen, die ein dynamisches Array akzeptiert. Ich MUSS aber FindKey benutzen, da es hundert mal schneller ist als Locate. (in eigenen Tests mit einer großen Abfrage-Schleife in einer Paradox-Datenbank: Locate 13:23 Minuten, FindKey 6:33 Minuten

Also nochmal zusammengefasst:
Ich habe ein dynamisches Array (of Variant), dessen Größe erst zur Laufzeit feststeht (max. 10 bis 12 Elemente).
Dieses stellt Zeilenwerte dar, die ich in einer Tabelle finden muss.
Mittels Locate problemlos möglich - aber extrem langsam.
Mittels FindKey wesentlich schneller, aber diese Methode will unbedingt ein statisches Array.
Wie?

Majortomster 3. Jun 2005 15:30

Re: Arrays, dynamisch-->statisch
 
Ideal wäre das:

Delphi-Quellcode:

class function kl.funkt(dynArr : array of variant) : boolean;
var
   findArray : array [0..(High(dynArr)+1)] of variant;
begin
//  [...]
   FindKey(findArray)
//  usw...
end;

Aber das geht natürlich in Delphi nicht :|
Ich könnte natürlich auch von vornherein 12 statische Arrays anlegen. Eines mit einem Element, eines mit 2 Elementen ... und so weiter - bis 12 Elemente.
Bei Beginn der Funktion wird die Größe des dynamischen geprüft und anhand dessen entschieden, in welches der 12 statischen Arrays die Daten übertragen werden, so dass es mit FindKey benutzt werden kann.
Das würde bestimmt klappen, aber diese Lösung wäre wohl mehr als dämlich, meint ihr nicht?


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:15 Uhr.
Seite 1 von 2  1 2      

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 by Thomas Breitkreuz