AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Arrays, dynamisch-->statisch

Ein Thema von Majortomster · begonnen am 2. Jun 2005 · letzter Beitrag vom 29. Sep 2007
Antwort Antwort
Seite 1 von 2  1 2      
Majortomster

Registriert seit: 11. Mai 2005
27 Beiträge
 
#1

Arrays, dynamisch-->statisch

  Alt 2. Jun 2005, 16:07
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
  Mit Zitat antworten Zitat
barf00s
(Gast)

n/a Beiträge
 
#2

Re: Arrays, dynamisch-->statisch

  Alt 2. Jun 2005, 16:09
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

Move(Pointer(aStatic)^, Pointer(aDynamic)^, iStaticArrayElementCount * SizeOf(aStatic[0]));
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#3

Re: Arrays, dynamisch-->statisch

  Alt 2. Jun 2005, 16:10
Moin!

Zitat von Majortomster:
Ich brauche unbedingt ein statisches Array, denn die Methode TCustomClientDataSet.FindKey akzeptiert NUR ein statisches...
Wie kommst du darauf?

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!
  Mit Zitat antworten Zitat
Phistev
(Gast)

n/a Beiträge
 
#4

Re: Arrays, dynamisch-->statisch

  Alt 2. Jun 2005, 16:21
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: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;
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#5

Re: Arrays, dynamisch-->statisch

  Alt 2. Jun 2005, 21:03
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.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
barf00s
(Gast)

n/a Beiträge
 
#6

Re: Arrays, dynamisch-->statisch

  Alt 3. Jun 2005, 07:58
@phistev, mütze .... wiederholt ihr immer die antwort des vorgängers???
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#7

Re: Arrays, dynamisch-->statisch

  Alt 3. Jun 2005, 13:03
Moin!

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
  Mit Zitat antworten Zitat
barf00s
(Gast)

n/a Beiträge
 
#8

Re: Arrays, dynamisch-->statisch

  Alt 3. Jun 2005, 13:13
ich sehs grad ^^ hab mich ja tatsächlich verschrieben
ich nehm alles zurück, schulligung nommel
  Mit Zitat antworten Zitat
Majortomster

Registriert seit: 11. Mai 2005
27 Beiträge
 
#9

Re: Arrays, dynamisch-->statisch

  Alt 3. Jun 2005, 14:08
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?
  Mit Zitat antworten Zitat
Majortomster

Registriert seit: 11. Mai 2005
27 Beiträge
 
#10

Re: Arrays, dynamisch-->statisch

  Alt 3. Jun 2005, 14:30
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?
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 09:09 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