![]() |
Delphi-Version: 10.3 Rio
TArray<string> als const im Record deklarieren
Gab es das nicht mal früher? Konnte man
Delphi-Quellcode:
nicht mal irgendwie mit TArray<string> deklarieren?
const
X: array[0 .. 1] of string = ('1', '2');
Delphi-Quellcode:
Wie macht man es richtig?
const
X: TArray<string>('1', '2'); 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. |
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 |
AW: TArray<string> als const deklarieren
Ich dachte immer das geht so auch irgendwie
![]()
Delphi-Quellcode:
const
MyArray: TArray<String> = ['First','Second','Third']; |
AW: TArray<string> als const deklarieren
Du hast die Lösung da doch selbst verlinkt.
|
AW: TArray<string> als const deklarieren
Zitat:
Delphi-Quellcode:
type
TRec = record const MyArray: TArray<String> = ['First','Second','Third']; end; |
AW: TArray<string> als const deklarieren
Zitat:
Siehe hierzu ![]() 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:
Delphi-Quellcode:
deklarieren.
['value1', 'value2']
Zweitens sind
Delphi-Quellcode:
und
TArray<String>
Delphi-Quellcode:
zuweisungskompatibel, bzw. explizit umwandelbar:
array of String
Delphi-Quellcode:
Und, drittens, sind Parameter eines Array-Typs überhaupt keine echten "Array"-Parameter, sondern so genannte "offene Array-Parameter".
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; Deshalb kannst du ihnen eigentlich jeden Array-Typen, inklusive konstanter, statischer,
Delphi-Quellcode:
,
TArray<T>
Delphi-Quellcode:
und
TMyArray
Delphi-Quellcode:
übergeben, ohne dass der Compiler rummeckert. Innerhalb der Funktion werden sie dann (nicht wie
array of TMy
Delphi-Quellcode:
-Parameter!) als Array-Objekte, sondern als Kopien dieser verwendet.
TArray<T>
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 ![]() |
AW: TArray<string> als const im Record deklarieren
Zitat:
|
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:
Interessant dabei ist, daß man den Alias gar nicht verwenden muss...
type
TStringArray = TArray<string>; type TRec = record const MyArray: TArray<String> = ['First', 'Second', 'Third']; end; |
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:
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:
:oops:
const
Rec = record MyArray: array[0..2] of string; end = (MyArray: ('First','Second','Third')); |
AW: TArray<string> als const im Record deklarieren
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:14 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