Delphi-PRAXiS
Seite 1 von 3  1 23   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   TArray<string> als const im Record deklarieren (https://www.delphipraxis.net/202760-tarray-string-als-const-im-record-deklarieren.html)

DieDolly 5. Dez 2019 13:16

Delphi-Version: 10.3 Rio

TArray<string> als const im Record deklarieren
 
Gab es das nicht mal früher? Konnte man
Delphi-Quellcode:
const
 X: array[0 .. 1] of string = ('1', '2');
nicht mal irgendwie mit TArray<string> deklarieren?
Delphi-Quellcode:
const
 X: TArray<string>('1', '2');
Wie macht man es richtig?

Warum?
Ich habe eine Funktion, die TArray<string> entgegennimmt. Und X als Parameter nimmt sie nicht, da es array of string ist.
Folglich müsste ich also den Funktionskopf zu array of string umschreiben. Kein Großes Problem, aber inkonsistent am Ende, wenn man nur noch TArray<string> verwendet.

Andreas13 5. Dez 2019 13:23

AW: TArray<string> als const deklarieren
 
array[0 .. 1] of string ist ein statisches Array, TArray<string> ist dagegen ein dynamisches Array mit einer Länge von 0 bei der Deklaration. Bevor Du den Inhalt reinpackst, muß Du mit SetLength(..) die Länge einstellen. Erst danach kännen die Elemente belegt werden. Deswegen geht die Const-Deklaration nicht.
Gruß, Andreas

DieDolly 5. Dez 2019 13:33

AW: TArray<string> als const deklarieren
 
Ich dachte immer das geht so auch irgendwie

https://stackoverflow.com/questions/...22929#25622929

Delphi-Quellcode:
const
  MyArray: TArray<String> = ['First','Second','Third'];

Daniel 5. Dez 2019 13:34

AW: TArray<string> als const deklarieren
 
Du hast die Lösung da doch selbst verlinkt.

DieDolly 5. Dez 2019 13:37

AW: TArray<string> als const deklarieren
 
Zitat:

[dcc32 Fehler] F.pas(263): E2086 Typ 'TArray<T>' ist nicht vollständig definiert
Das scheint wohl nicht so zu funktionieren. Nur ohne Record
Delphi-Quellcode:
type
 TRec = record
 const
  MyArray: TArray<String> = ['First','Second','Third'];
end;

Dennis07 5. Dez 2019 15:04

AW: TArray<string> als const deklarieren
 
Zitat:

Zitat von DieDolly (Beitrag 1452822)
Zitat:

[dcc32 Fehler] F.pas(263): E2086 Typ 'TArray<T>' ist nicht vollständig definiert
Das scheint wohl nicht so zu funktionieren. Nur ohne Record
Delphi-Quellcode:
type
 TRec = record
 const
  MyArray: TArray<String> = ['First','Second','Third'];
end;

Das ist ein Bug im Compiler, der nach wie vor verhindert, generische Arrays in Klassen oder Records zu verwenden.
Siehe hierzu RSP-21151. Wurde bisher nicht gefixt. Ob es zu den Bugs wird, die uns wohl für ewig erhalten bleiben werden, lässt sich nur vermuten. Es existiert seit es Generics gibt und wurde bereits vor fast anderthalb Jahren gemeldet.

Derzeit bleibt dir wohl nichts anderes übrig, als es entweder lokal in einer Methode, global in einer Unit, oder als normales statisches/dynamisches Array zu deklarieren.

Zitat:

Zitat von DieDolly (Beitrag 1452813)
Ich habe eine Funktion, die TArray<string> entgegennimmt. Und X als Parameter nimmt sie nicht, da es array of string ist.
Folglich müsste ich also den Funktionskopf zu array of string umschreiben. Kein Großes Problem, aber inkonsistent am Ende, wenn man nur noch TArray<string> verwendet.

Erstens kannst du beide auch inline mit
Delphi-Quellcode:
['value1', 'value2']
deklarieren.
Zweitens sind
Delphi-Quellcode:
TArray<String>
und
Delphi-Quellcode:
array of String
zuweisungskompatibel, bzw. explizit umwandelbar:

Delphi-Quellcode:
var
  a1: array of String;
  a2: TArray<String>;
begin
  a1 := a2; // Geht nicht
  a2 := a1; // Geht nicht
  TArray<String>(a1) := a2; // Geht
  a2 := TArray<String>(a1); // Geht
end;
Und, drittens, sind Parameter eines Array-Typs überhaupt keine echten "Array"-Parameter, sondern so genannte "offene Array-Parameter".
Deshalb kannst du ihnen eigentlich jeden Array-Typen, inklusive konstanter, statischer,
Delphi-Quellcode:
TArray<T>
,
Delphi-Quellcode:
TMyArray
und
Delphi-Quellcode:
array of TMy
übergeben, ohne dass der Compiler rummeckert. Innerhalb der Funktion werden sie dann (nicht wie
Delphi-Quellcode:
TArray<T>
-Parameter!) als Array-Objekte, sondern als Kopien dieser verwendet.
Das heißt, selbst, wenn du das Array-Objekt in der Funktion veränderst (zB. ein Element veränderst), bleibt das Ursprungsarray gleich.

Wenn du mehr über offene Arrays wissen willst, habe ich dazu einen ausführlichen Post vor einiger Zeit geschrieben. Du findest ihn hier.

DieDolly 5. Dez 2019 16:30

AW: TArray<string> als const im Record deklarieren
 
Zitat:

Das ist ein Bug im Compiler, der nach wie vor verhindert, generische Arrays in Klassen oder Records zu verwenden.
Na super. Dann wird der woh ewig bleiben.

Uwe Raabe 5. Dez 2019 16:42

AW: TArray<string> als const im Record deklarieren
 
Man kann aber auch einfach mal ganz pragmatisch dem Compiler auf die Sprünge helfen. Das ist vermutlich effizienter als auf einen Fix zu warten:

Delphi-Quellcode:
type
  TStringArray = TArray<string>;

type
  TRec = record
  const
    MyArray: TArray<String> = ['First', 'Second', 'Third'];
  end;
Interessant dabei ist, daß man den Alias gar nicht verwenden muss...

himitsu 5. Dez 2019 17:56

AW: TArray<string> als const im Record deklarieren
 
Warum muß diese Konstante denn ein dynamisches Array und kann nicht statisch sein? (OK, bei Zuweisung an ein dynamisch Array muß dann umkopiert werden)

Kann Delphi nicht auch inzwischen bei statischen Arrays die Länge selbst bestimmen?
Delphi-Quellcode:
const X: array[] of string = ('1', '2');




Zitat:

Delphi-Quellcode:
var
  a1: array of String;
  a2: TArray<String>;

Array of string definiert an dieser stelle einen neuen Typ und der ist dann mit dem anderen Array nicht zuweisungskompatibel (auch wenn die Typen intern ja eigentlich gleich sind-
Entsprechend dem obrigen Beispiel das, was der Compiler daraus macht:
Delphi-Quellcode:
type
  T1: array of String;
  T1: array of String;
var
  a1: T1;
  a2: T2;
Delphi-Quellcode:
type
  Tx: array of String; // globaler Typ aus TArray<T>
var
  a1: Tx;
  a2: Tx;

Bei den Generics ala TArray<T> werden die gleichgeschriebenen Typen überall auch gleich identisch verwendet, also mit dem selben Typen der ersten Deklaration.



Zitat:

Delphi-Quellcode:
type
  TRec = record
  const
    MyArray: TArray<String> = ['First','Second','Third'];
  end;

Bei Dem dachte ich zuerst an
Delphi-Quellcode:
const
  Rec = record
    MyArray: array[0..2] of string;
  end = (MyArray: ('First','Second','Third'));
:oops:

DieDolly 5. Dez 2019 18:01

AW: TArray<string> als const im Record deklarieren
 
Zitat:

Kann Delphi nicht auch inzwischen bei statischen Arrays die Länge selbst bestimmen?
Nein.


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:40 Uhr.
Seite 1 von 3  1 23   

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