Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Array-Parameterübergabe (https://www.delphipraxis.net/85096-array-parameteruebergabe.html)

LucasL 25. Jan 2007 21:18


Array-Parameterübergabe
 
Hallo zusammen,

um ein Array (of Single) zu übergeben habe ich folgendes versucht:

Delphi-Quellcode:

  obj.func([0.3, 1.0], [0.0]);
Die Fehlermeldung: "E2001 Ordinaltyp erforderlich" - Daraus schließe ich, dass ich nur Arrays irgendeines Ordinaltyps auf diese Weise übergeben kann. Ist dem so :gruebel:? Wenn ja, wäre das doch eine ziemlich hässliche Einschränkung...

Danke und Gruß,
Lucas

mkinzler 25. Jan 2007 21:20

Re: Array-Parameterübergabe
 
Du mußt ne Variable übergeben.

LucasL 25. Jan 2007 21:25

Re: Array-Parameterübergabe
 
okay...und warum?

mkinzler 25. Jan 2007 21:26

Re: Array-Parameterübergabe
 
Bei der Übergabe eines Arrays wird ein Zeiger auf diesen Übergeben.

Hawkeye219 25. Jan 2007 21:35

Re: Array-Parameterübergabe
 
Hallo Lucas,

siehe auch diesen Thread.

Die Lösung wäre ein konstantes Array oder (ab Delphi 2005/6) das hier:

Delphi-Quellcode:
type
  TDynSingleArray = array of single;
begin
  obj.func (TDynSingleArray.Create(0.3, 0.1),
            TDynSingleArray.Create(0.0));
end;
Gruß Hawkeye

Jelly 25. Jan 2007 21:39

Re: Array-Parameterübergabe
 
Seit wann hat ein Array ein Constructor :gruebel:

3_of_8 25. Jan 2007 21:40

Re: Array-Parameterübergabe
 
Ich könnte mir gut vorstellen, dass das in den neueren Delphi-Versionen geht.

LucasL 25. Jan 2007 22:02

Re: Array-Parameterübergabe
 
Zitat:

Zitat von mkinzler
Bei der Übergabe eines Arrays wird ein Zeiger auf diesen Übergeben.

Normalerweise ja. Vielleicht sorgt der Array-Konstruktor dafür, dass trotzdem ein Werteparameter übergeben wird. In der Hilfe zu "Offene Array-Konstruktoren" steht zwar etwas dazu, aber es fehlen Details.

Zitat:

type
TDynSingleArray = array of single;
begin
obj.func (TDynSingleArray.Create(0.3, 0.1),
TDynSingleArray.Create(0.0));
end;
Danke Hawkeye, das ist schonmal was :).

3_of_8 25. Jan 2007 22:05

Re: Array-Parameterübergabe
 
Du sagst du willst ein Array übergeben.

Du schreibst aber:
Delphi-Quellcode:
obj.func([0.3, 1.0], [0.0]);
Das sind zwei Arrays für mich. Hast du eventuell die Klammern falsch gesetzt?

Delphi-Quellcode:
obj.func([0.3, 1.0, 0.0]);

LucasL 25. Jan 2007 22:09

Re: Array-Parameterübergabe
 
Ne... ich dacht mir im Code-Beispiel nur "wieso so geizig"... ;)

3_of_8 25. Jan 2007 22:15

Re: Array-Parameterübergabe
 
Delphi-Quellcode:
{$O-}

procedure TForm1.test(a: array of Single);
begin
  asm nop end;
end;


procedure TForm1.FormCreate(Sender: TObject);
begin
  test([4.2, 13.37]);
end;
Bei mir kompiliert das und das Array enthält auch die richtigen Werte.

EDIT: Mit zwei Arrays gehts genauso. Wie hast du deine Methode deklariert?
EDIT2: Unter Delphi 7.

Hawkeye219 25. Jan 2007 22:30

Re: Array-Parameterübergabe
 
Manuel, du hast Recht. Es hängt einzig und allein von der Signatur der aufgerufenen Routine ab. Bei dem von mir verlinkten Thread wurde die Funktion CreatePolygonRgn verwendet, die einen typenlosen CONST-Parameter erwartet. Hier funktioniert nur die von mir vorgestellte Lösung mit dem Konstruktor-Aufruf (und auch nur ab Delphi 2005/6). Wenn (wie in deinem Beispiel) der Parameter mit Typ vereinbart wird, funktionieren beide Lösungen - auch in früheren Delphi-Versionen.

Gruß Hawkeye

LucasL 26. Jan 2007 20:17

Re: Array-Parameterübergabe
 
Stimmt, es funktioniert. Folgendes kompiliert jedoch nicht (und so habe ich es gemacht):

Delphi-Quellcode:
type
  TInput = array of Single;

procedure proc(Input: TInput);
asm
  nop;
end;

begin
  proc([0.0, 1.0]);
end;

Hawkeye219 26. Jan 2007 20:31

Re: Array-Parameterübergabe
 
Hallo Lucas,

du mußt deine Routine ein wenig abändern:

Delphi-Quellcode:
procedure proc(const Input: array of Single);
asm
  nop;
end;
Gruß Hawkeye


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:43 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-2025 by Thomas Breitkreuz