Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Variable Übergabeparameter (https://www.delphipraxis.net/79784-variable-uebergabeparameter.html)

xZise 28. Okt 2006 11:48


Variable Übergabeparameter
 
Ich wollte eine folgende Funktion schreiben:
Delphi-Quellcode:
procedure changeItemsnum(vArray : ??? ; vItems : Integer);
begin
  SetLength(vArray, Length(vArray) + vItems);
end;
Was muss jetzt ansitelle von "vArray", um eben alle arrays zu benutzen? Also integerarrays, stringarrays, oder andere, ohne eine eigene Methode zu schreiben?

shubbi 28. Okt 2006 12:20

Re: Variable Übergabeparameter
 
Das geht meines Wissens nach nicht.

Meflin 28. Okt 2006 12:24

Re: Variable Übergabeparameter
 
gibts da nicht sowas wie array of const :gruebel:


shubbi 28. Okt 2006 12:27

Re: Variable Übergabeparameter
 
Array of const bedeuted, dass du der Funktion ein Array von verschiedenen Typen übergeben kannst (z.B. bei Format(f: string; arg: array of const) )
Das ist so etwas ähnliches wie "..." in C (z.B. printf(char *fmt, ...) ) und ist nicht mit einem normalen array zu verwechseln

mkinzler 28. Okt 2006 12:31

Re: Variable Übergabeparameter
 
Array of Variant
TVarArray
TVarRec

Cöster 28. Okt 2006 12:34

Re: Variable Übergabeparameter
 
Du könntest dir einen Typ TArray basteln, von dem du dann mehrere Typen ableleitest TIntArray, TStringArray, TCharArray usw.

Flare 28. Okt 2006 14:10

Re: Variable Übergabeparameter
 
Man könnte doch auch einfach die Funktion überladen, oder spricht da gerade etwas dagegen?


Flare

Neutral General 28. Okt 2006 14:11

Re: Variable Übergabeparameter
 
Naja da spricht dagegen das man viel zu tun hätte und das man bei jedem neuen Array Typ noch ne Funktion mehr bauen müsste...

Zitat:

Zitat von mkinzler
Array of Variant
TVarArray
TVarRec

Habs mal ausprobiert...

TVarArray und TVarRec funktioniert nicht und Array of Variant würde bei Objekten nicht funktionieren :|

Meflin 28. Okt 2006 14:20

Re: Variable Übergabeparameter
 
Zitat:

Zitat von Neutral General
Naja da spricht dagegen das man viel zu tun hätte und das man bei jedem neuen Array Typ noch ne Funktion mehr bauen müsste...

So musst du eben innerhalb einer Funktion die Unterscheidung treffen, wo ist der Unterschied? Im Grund sind überladene Funktionen ja genau für so etwas gedacht... im Zweifelsfall implementiert man eben die Funktionalität nur in einer Funktion und in den restlichen konvertiert man in das Format dieser einen Funktion und übergibt die Werte an diese...


xZise 30. Sep 2007 17:37

Re: Variable Übergabeparameter
 
So :) Endlich bin ich mal dazu gekommen, aber es funktioniert nicht :
Delphi-Quellcode:
procedure Insert(const AData; AArray : array of const; const AIndex : Cardinal);
var
  i: Cardinal;
begin
  if (AIndex <= Length(AArray)) then
  begin
    SetLength(AArray, Length(AArray) + 1);
    for i := High(AArray) downto AIndex + 1 do
      AArray[i] := AArray[i - 1];
    AArray[AIndex] := AData;
  end;
end;
Zitat:

Inkompatible Typen
Inkompatible Typen: 'TVarRec' und 'procedure, untyped pointer or untyped parameter'

Dax 30. Sep 2007 17:42

Re: Variable Übergabeparameter
 
Zitat:

Zitat von xZise
Ich wollte eine folgende Funktion schreiben:
Delphi-Quellcode:
procedure changeItemsnum(vArray : ??? ; vItems : Integer);
begin
  SetLength(vArray, Length(vArray) + vItems);
end;

Das ist so einfach nicht möglich. Du müsstest in diesem Fall einen Pointer auf dein Array liefern, die Typeinfos, die zum Array gehören, und die Zahl der Elemente. Mit const-Parametern geht es schon mal garnicht, da diese nicht verändert werden können.

Am besten siehst du dir mal die RTL-Quellen von SetLength an, damit du siehst, wie schwer sowas ist ;)

Khabarakh 30. Sep 2007 18:36

Re: Variable Übergabeparameter
 
@xZise: Hm, was hast du denn gegen T(Object)List ;) ?
Du könntest natürlich auf Tiburón warten und schauen, ob es dann mit dessen Generics zu lösen ist :mrgreen: (was ich aber nicht erwarte) - aber ein Array ist hier einfach der falsche Ansatz, eine Liste dagegen dafür geschaffen.

xZise 30. Sep 2007 18:42

Re: Variable Übergabeparameter
 
Zitat:

Zitat von Khabarakh
Du könntest natürlich auf Tiburón warten und schauen, ob es dann mit dessen Generics zu lösen ist :mrgreen: (was ich aber nicht erwarte)

Würden jbgs Generics auch in TD-E laufen hätte ich das Problem nicht :(

Zitat:

Zitat von Khabarakh
aber ein Array ist hier einfach der falsche Ansatz, eine Liste dagegen dafür geschaffen.

Weil, ich dann im Hintergrund eine Liste halten müsste. Und ich denke Arrays sind einfacher zu handeln ;) Bis eben auf das hinzufügen, entfernen, einfügen von informationen. Da versagt es ^^ Vielleicht sieht das CodeGear eine möglichkeit (Variable Arrays zu übergeben & editieren) :)

Dax 30. Sep 2007 19:23

Re: Variable Übergabeparameter
 
Zitat:

Zitat von xZise
Weil, ich dann im Hintergrund eine Liste halten müsste.

Welche Eigenschaften von Arrays wiegen die Vorteile einer Liste wie einfaches Einfügen und Entfernen von Elementen, Iteratoren usw. wieder auf?


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:58 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