![]() |
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 |
Re: Arrays, dynamisch-->statisch
statisches array kannst mit
Delphi-Quellcode:
festlegen...
type
TArray = array of integer; var aInteger: TArray; begin SetLength(aInteger, 100); // 100 elemente festlegen end; öhm dynamisch zu statisch würde mit "Move" wunderbar klappen
Delphi-Quellcode:
Move(Pointer(aStatic)^, Pointer(aDynamic)^, iStaticArrayElementCount * SizeOf(aStatic[0]));
|
Re: Arrays, dynamisch-->statisch
Moin!
Zitat:
Zitat:
MfG Muetze1 /EDIT: Wieder keine Meldung! |
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:
Ein statisches Array deklariert man übrigens als:
var groesse: integer;
//Größe berechnen SetLength(aInteger, groesse);
Delphi-Quellcode:
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:
type TIntArray: array[0..100] of integer
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; |
Re: Arrays, dynamisch-->statisch
Zitat:
Delphi-Quellcode:
So, oder ähnlich sollte es klappen. Performance sollte akzeptabel sein.
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; |
Re: Arrays, dynamisch-->statisch
@phistev, mütze .... wiederholt ihr immer die antwort des vorgängers???
|
Re: Arrays, dynamisch-->statisch
Moin!
Zitat:
MfG Muetze1 |
Re: Arrays, dynamisch-->statisch
ich sehs grad ^^ hab mich ja tatsächlich verschrieben :)
ich nehm alles zurück, schulligung nommel |
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? |
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. |
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