Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Konstante in Konstante (https://www.delphipraxis.net/211942-konstante-konstante.html)

lxo 24. Nov 2022 15:17

Konstante in Konstante
 
Hallo zusammen,

kann mir einer erklären wieso a1 keine Konstante ist?
Delphi-Quellcode:
const
 a1: String = 'a';
 a2 = 'a';

 a3 = a1; // E2026 Konstantenausdruck erwartet
 a3 = a2; // Kein Problem

 a3: String = a1; // E2026 Konstantenausdruck erwartet
 a3: String = a2; // Kein Problem

Andreas13 24. Nov 2022 15:19

AW: Konstante in Konstante
 
gelöscht

Sherlock 24. Nov 2022 15:46

AW: Konstante in Konstante
 
Das ist eine typisierte Konstante. Für die gelten halt Einschränkungen. https://docwiki.embarcadero.com/RADS...rte_Konstanten

Sherlock

Der schöne Günther 24. Nov 2022 16:22

AW: Konstante in Konstante
 
Übrigens eins der Dinge die mich am meisten in Delphi aufregen. Du kannst nicht mal ein
Delphi-Quellcode:
case
-Statement über eine "typisierte Konstante", geschweige denn einen String machen.

Wenn man da schaut was mit C# oder Rust an Pattern Matching möglich ist... Alter Schwede.

Ok, aber das war wahrscheinlich gar nicht gefragt...

himitsu 24. Nov 2022 16:50

AW: Konstante in Konstante
 
Eine "typisierte Konstante" ist delphi-intern eigentlich nur eine "schreibgeschützte Variable".

Untypisierte Konstanten, bzw. deren Wert wird bei Verwendung oftmals direkt an den Verwendungsorten eingesetzt/ersetzt. (bzw. Berechnungen kann der Compiler direkt auflösen/kürzen)
Typisierten Konstanten werden immer nur referenziert (mit Variablen-Referenzen kann CASE leider nicht umgehen). Ja, somit könnte man auch zentral deren Wert zur Laufzeit umschreiben.

Delphi-Quellcode:
const
 *a1: String = 'a';
 *a2 = String('a');
 *a3 = 'a';
Und z.B. TGUID, kann mit der Stringdeklaration '{0123-....-67-89}' nicht als untypisierte Konstante deklariert und somit auch an vielen Stellen nicht verwendet werden, z.B. in Interface-Deklarationen oder Array/Record-Konstanten.

freimatz 25. Nov 2022 07:38

AW: Konstante in Konstante
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1515306)
Übrigens eins der Dinge die mich am meisten in Delphi aufregen. Du kannst nicht mal ein
Delphi-Quellcode:
case
-Statement über eine "typisierte Konstante", geschweige denn einen String machen.

Ich persönlich bin ganz froh drum. Es verhindert dass ich selber Strings für Aufzählungen missbrauche.

BerndS 25. Nov 2022 07:53

AW: Konstante in Konstante
 
Case mit Strings geht doch über IndexStr bzw. IndexText.
Delphi-Quellcode:
     
  case IndexText(S, ['1', '2', '3']) of
        0:
          ...
        1:
          ...
        3:
          ...

      end;

dummzeuch 25. Nov 2022 08:03

AW: Konstante in Konstante
 
Und nicht vergessen: Es gibt einen Compiler-Switch, der es erlaubt, typisierte Konstanten zu verändern:

J+
bzw.
{$WRITEABLECONST ON}

Das würde bei case-Statements zu Chaos führen und deshalb sind sie nicht erlaubt.

Delphi-Quellcode:
Case x of
  a: ;
  b: ;
end;
ist intern etwas anderes als
Delphi-Quellcode:
if x = a then begin
end else if x = b then begin
end;

TiGü 25. Nov 2022 08:30

AW: Konstante in Konstante
 
Ich habe nichts produktives beizutragen, möchte aber meinen Unmut ebenso wie Günther darüber ausdrücken.
Erst Anfang der Woche wieder darüber gestolpert, als ich mehrere typisierte Konstanten mit gleichen Inhalt zusammenfassen wollte.

himitsu 25. Nov 2022 09:19

AW: Konstante in Konstante
 
Zu unerwarteten Fehlern beim CASE würde es nur führen, wenn man doppelte Werte durch die Änderungen bekommt UND der Compiler die Reihenfolge der Auswertung geändert (optimiert) hat.

Normal macht Case intern kein
Delphi-Quellcode:
if i = 0 then ...
else if i = 1 then ...
else if i = 3 then ...
else if i = 4 then ...
else if i = -5 then ...
else ...
sondern eher sowas
Delphi-Quellcode:
//Inc(i, 132) or Dec(i, 123) wenn erster Wert keine 0 ist
if i = 0 then ... // am Ende jeweils ein "goto CaseEnd;"
Dec(i);
if i = 0 then ...
Dec(i, 2);
if i = 0 then ...
Dec(i);
if i = 0 then ...
Inc(i, 9);
if i = 0 then ...
{else} ...
CaseEnd:
Ja, und sowas klappt nur, wenn die Konstanten "unveränderbar" sind, damit der Compiler quasi mit ihnen "rechnen" kann.


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:39 Uhr.
Seite 1 von 2  1 2      

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