Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Problem mit typisierten Konstanten (https://www.delphipraxis.net/187329-problem-mit-typisierten-konstanten.html)

SMO 19. Nov 2015 17:56

Delphi-Version: XE6

Problem mit typisierten Konstanten
 
Hallo! Kann jemand von euch erklären, wieso typisierte Konstanten in Delphi so restriktiv sind?

Beispiel:

Delphi-Quellcode:
type
  TFourCC = array [0..3] of AnsiChar;

  TChunkHeader = packed record
    ID:  TFourCC;
    Size: Cardinal;
  end;

const
  RiffConst = 'RIFF';           // untypisiert
  Riff4CC: TFourCC = 'RIFF';
  RiffStr: AnsiString = 'RIFF';

const // oder auch var
  DefaultHeader0: TChunkHeader = (ID: 'RIFF'; Size: 0);    // funktioniert
  DefaultHeader1: TChunkHeader = (ID: RiffConst; Size: 0); // funktioniert
  DefaultHeader2: TChunkHeader = (ID: Riff4CC; Size: 0);   // E2026: Constant expression expected
  DefaultHeader3: TChunkHeader = (ID: RiffStr; Size: 0);   // E2026: Constant expression expected
  DefaultHeader4 = DefaultHeader0;                         // E2026: Constant expression expected
  DefaultHeader5: TChunkHeader = DefaultHeader0;           // "(" expected
Dass DefaultHeader3 nicht geht, akzeptiere ich ja, denn TFourCC ist nicht zuweisungskompatibel mit AnsiString (von array of [Ansi]Char nach [Ansi]String geht, da hat Delphi ein paar nette automatische Funktionen, aber von String nach array of Char geht verständlicherweise nicht).

Aber dass DefaultHeader2 nicht funktioniert, finde ich schon sehr seltsam, denn die Typen sind ja absolut identisch.

Was denkt ihr darüber? Sollten solche Konstrukte erlaubt sein oder nicht? Sind sie das vielleicht schon in den neuen Versionen > XE6?


Kleines Detail am Rande, das mit der Frage nichts zu tun hat, aber ganz interessant ist, wenn man gerne schaut, was Delphi hinter den Kulissen macht:
Delphi-Quellcode:
procedure Test1(out ChunkHeader: TChunkHeader);
begin
  ChunkHeader.ID := RiffConst; // funktioniert
  // RiffConst = 'RIFF' wird hier als DWORD im Codesegment (.text) gespeichert,
  // genauer gesagt unmittelbar an der Adresse nach dieser Prozedur!
end;

procedure Test2(out ChunkHeader: TChunkHeader);
begin
  ChunkHeader.ID := Riff4CC; // funktioniert
  // Riff4CC = 'RIFF' wird hier ganz normal als DWORD im Datensegment (.data) gespeichert
end;

Der schöne Günther 19. Nov 2015 18:03

AW: Problem mit typisierten Konstanten
 
Das ist viel nerviger bei Standard-Belegungen für Methoden-Parameter. Die Standardwerte dürfen auch keine typisierten Konstanten sein.

TiGü 20. Nov 2015 09:18

AW: Problem mit typisierten Konstanten
 
Vor dem gleichen Problem stand ich neulich auch und war dann hinterher ganz verwundert, als ich zufällig die Typsierung der Konstante entfernt hatte und es auf einmal ging.
Richtig verstanden hatte ich es auch nicht.


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:12 Uhr.

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