AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

TArray<string> als const im Record deklarieren

Ein Thema von DieDolly · begonnen am 5. Dez 2019 · letzter Beitrag vom 15. Dez 2019
Antwort Antwort
Seite 1 von 3  1 23   
DieDolly

Registriert seit: 22. Jun 2018
1.361 Beiträge
 
#1

TArray<string> als const im Record deklarieren

  Alt 5. Dez 2019, 14:16
Delphi-Version: 10.3 Rio
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.

Geändert von DieDolly ( 5. Dez 2019 um 14:37 Uhr)
  Mit Zitat antworten Zitat
Andreas13

Registriert seit: 14. Okt 2006
Ort: Nürnberg
144 Beiträge
 
Delphi XE5 Professional
 
#2

AW: TArray<string> als const deklarieren

  Alt 5. Dez 2019, 14:23
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
Wenn man seinem Nächsten einen steilen Berg hinaufhilft, kommt man selbst dem Gipfel näher.
John C. Cornelius
  Mit Zitat antworten Zitat
DieDolly

Registriert seit: 22. Jun 2018
1.361 Beiträge
 
#3

AW: TArray<string> als const deklarieren

  Alt 5. Dez 2019, 14:33
Ich dachte immer das geht so auch irgendwie

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

Delphi-Quellcode:
const
  MyArray: TArray<String> = ['First','Second','Third'];
  Mit Zitat antworten Zitat
Daniel
(Administrator)

Registriert seit: 30. Mai 2002
Ort: Hamburg
15.236 Beiträge
 
Delphi 10.3 Rio
 
#4

AW: TArray<string> als const deklarieren

  Alt 5. Dez 2019, 14:34
Du hast die Lösung da doch selbst verlinkt.
Daniel R. Wolf
Admin Delphi-PRAXiS
mit Grüßen aus Hamburg
  Mit Zitat antworten Zitat
DieDolly

Registriert seit: 22. Jun 2018
1.361 Beiträge
 
#5

AW: TArray<string> als const deklarieren

  Alt 5. Dez 2019, 14:37
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;
  Mit Zitat antworten Zitat
Dennis07
Online

Registriert seit: 19. Sep 2011
Ort: Deutschland
402 Beiträge
 
Delphi 10.3 Rio
 
#6

AW: TArray<string> als const deklarieren

  Alt 5. Dez 2019, 16:04
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.

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 ['value1', 'value2'] deklarieren.
Zweitens sind TArray<String> und 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, TArray<T> , TMyArray und array of TMy übergeben, ohne dass der Compiler rummeckert. Innerhalb der Funktion werden sie dann (nicht wie 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.
Dennis
  Mit Zitat antworten Zitat
DieDolly

Registriert seit: 22. Jun 2018
1.361 Beiträge
 
#7

AW: TArray<string> als const im Record deklarieren

  Alt 5. Dez 2019, 17:30
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.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
7.344 Beiträge
 
Delphi 10.3 Rio
 
#8

AW: TArray<string> als const im Record deklarieren

  Alt 5. Dez 2019, 17:42
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...
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
35.205 Beiträge
 
Delphi 10.3 Rio
 
#9

AW: TArray<string> als const im Record deklarieren

  Alt 5. Dez 2019, 18:56
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?
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'));
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014

Geändert von himitsu ( 5. Dez 2019 um 18:58 Uhr)
  Mit Zitat antworten Zitat
DieDolly

Registriert seit: 22. Jun 2018
1.361 Beiträge
 
#10

AW: TArray<string> als const im Record deklarieren

  Alt 5. Dez 2019, 19:01
Zitat:
Kann Delphi nicht auch inzwischen bei statischen Arrays die Länge selbst bestimmen?
Nein.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:55 Uhr.
Powered by vBulletin® Copyright ©2000 - 2020, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2019 by Daniel R. Wolf