AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Problem mit typisierten Konstanten

Ein Thema von SMO · begonnen am 19. Nov 2015 · letzter Beitrag vom 20. Nov 2015
Antwort Antwort
SMO

Registriert seit: 20. Jul 2005
178 Beiträge
 
Delphi XE6 Professional
 
#1

Problem mit typisierten Konstanten

  Alt 19. Nov 2015, 17:56
Delphi-Version: XE6
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;
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.110 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: Problem mit typisierten Konstanten

  Alt 19. Nov 2015, 18:03
Das ist viel nerviger bei Standard-Belegungen für Methoden-Parameter. Die Standardwerte dürfen auch keine typisierten Konstanten sein.
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.060 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: Problem mit typisierten Konstanten

  Alt 20. Nov 2015, 09:18
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.
  Mit Zitat antworten Zitat
Antwort Antwort


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 09:49 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