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/)
-   -   SetLenght mit einem Array als var Parameter (https://www.delphipraxis.net/192817-setlenght-mit-einem-array-als-var-parameter.html)

Rabenrecht 22. Mai 2017 13:09

Delphi-Version: 5

SetLenght mit einem Array als var Parameter
 
Folgendes:

Delphi-Quellcode:
Procedure myProc(var Arr : Array of whatever);
begin
  [...]
  SetLength(Arr, irgendnezahl);
  [...]
end;
Da spuckt mir Delphi eine "Inkompatible Typen" Meldung beim Kompilieren aus.

Habe beim Rumprobieren, was da eigentlich den Fehler verursacht, herausgefunden, dass die Übergabe des Array als Referenz (also als Var Parameter) das Problem ist.

Frage 1: Warum ist das so?
Kann mir da keinen zwingenden technischen Grund denken.

Frage 2: Kann man das irgendwie umgehen?


Die dynamische Veränderung der Größe des Arrays zur Laufzeit ist sinnvoll, da die Frage, ob und wenn ja wie viele Daten, die das Array aufnehmen soll, erst zur Laufzeit beantwortet werden kann.

Die Auslagerung der Logik nach myProc ist auch sinnvoll, da sie an unterschiedlichen Stellen in unterschiedlichen Kontexten gebraucht wird.
Will nicht heißen, dass ich den Code nicht grundlegend umstellen könnte, aber eigentlich wärs mir lieber, wenn das so, wie es jetzt im Wesentlichen ist, funktionieren würde :P


Nachtrag:

var oder nicht var macht keinen Unterschied.
Allein die Tatsache, dass das Array als Parameter übergeben wird, ist wohl ein Problem ... was mich noch verwirrter als vorher zurücklässt.

Der schöne Günther 22. Mai 2017 13:14

AW: SetLenght mit einem Array als var Parameter
 
Zitat:

Zitat von Rabenrecht (Beitrag 1372338)
Frage 1: Warum ist das so?

Weil der Compiler anscheinend nicht schlau genug ist zu sehen dass der Typ deiner Variable und der Typ deines Parameters der gleiche ist. Das "Array of" scheint zwei mal inline einen neuen Typ zu generieren. So zumindest hat man mir das mal erklärt.

Zitat:

Zitat von Rabenrecht (Beitrag 1372338)
Kann man das irgendwie umgehen?

Delphi-Quellcode:
type
   TWhatever = type Integer;
const
   someSpookyNumer = 42;
var
   myArray: TArray<TWhatEver>; // statt "array of TWhatEver"

procedure p(var data: TArray<TWhatever>); // statt "array of TWhatEver"
begin
   SetLength(data, someSpookyNumer);
end;

begin
   p(myArray);
end.

Rabenrecht 22. Mai 2017 13:28

AW: SetLenght mit einem Array als var Parameter
 
Ok, mit TArray<Type> anstatt Array of Type gibt zumindest der Kompiler Ruhe :thumb:

gammatester 22. Mai 2017 13:54

AW: SetLenght mit einem Array als var Parameter
 
Zum Warum: In Procedure myProc(var Arr : Array of whatever) ist ein Arr ein Open Array und kein dynamisches Array siehe http://docwiki.embarcadero.com/RADSt...ray_Parameters

haentschman 22. Mai 2017 14:50

AW: SetLenght mit einem Array als var Parameter
 
Hallöle...:P

Alternativ wäre auch eine TList<Whatever> oder TObjectlistList<Whatever> als Parameter, ohne Größeneinstellung, denkbar. :thumb:

PS: Im Eingangspost steht Delphi 5? Ist das korrekt? :gruebel:

Uwe Raabe 22. Mai 2017 15:16

AW: SetLenght mit einem Array als var Parameter
 
Zitat:

Zitat von haentschman (Beitrag 1372352)
PS: Im Eingangspost steht Delphi 5? Ist das korrekt? :gruebel:

Das ist leider immer noch der unsägliche Standardwert. Ich hätte da auch lieber ein <nicht angegeben> - das führt zu wesentlich weniger Verwirrung.

p80286 22. Mai 2017 15:38

AW: SetLenght mit einem Array als var Parameter
 
da fallen mir doch uralte Sünden ein?
wie wäre es mit:
Delphi-Quellcode:

type
  Tmyarray : Array of whatever;

Procedure myProc(var Arr : TMyArray);
Gruß
K-H

Stevie 22. Mai 2017 15:52

AW: SetLenght mit einem Array als var Parameter
 
Zitat:

Zitat von p80286 (Beitrag 1372360)
da fallen mir doch uralte Sünden ein?
wie wäre es mit:
Delphi-Quellcode:

type
  Tmyarray : Array of whatever;

Procedure myProc(var Arr : TMyArray);
Gruß
K-H

Wenn, dann bitte so wie Günther oben schrieb, alles andere führt nur wieder zu Typinkompatibilitäten.

himitsu 22. Mai 2017 17:22

AW: SetLenght mit einem Array als var Parameter
 
Delphi-Quellcode:
type
  Tmyarray : Array of whatever;
Hier muß immer dieser Typ verwendet werden ... nochmal irgendwo ein
Delphi-Quellcode:
Array of whatever
ist mit diesem Typen und mit
Delphi-Quellcode:
TArray<whatever>
nicht kompatibel.

Der Generic
Delphi-Quellcode:
TArray<whatever>
ist unterander kompatibel, egal wie oft man das irgendwo deklariert.


Wegen soeinem Mist ist
Delphi-Quellcode:
TArray<Byte>
, was oft verwendet wird, mit dem TBytes nicht kompatibel und man kann diese Byte-Arrays oftmals in vielen vorhandenen Funktionen verwenden, weil einige mit TArray<> und Andere mit TBytes deklatiert wurden, aber Emba einfach seit Jahren nicht auf die Bugreports reagiert, wo man darum bittet den Typen TBytes als TArray<Byte> zu deklarieren. :wall:

TiGü 23. Mai 2017 07:54

AW: SetLenght mit einem Array als var Parameter
 
Zitat:

Zitat von himitsu (Beitrag 1372382)
...aber Emba einfach seit Jahren nicht auf die Bugreports reagiert, wo man darum bittet den Typen TBytes als TArray<Byte> zu deklarieren. :wall:

Vielleicht weil das schon vor Jahren passiert ist?
Siehe bspw. Delphi XE6, Unit System.SysUtils, Zeile 137:
Delphi-Quellcode:
type

  TBytes = TArray<Byte>;


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:41 Uhr.
Seite 1 von 2  1 2      

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