![]() |
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 |
AW: Konstante in Konstante
gelöscht
|
AW: Konstante in Konstante
Das ist eine typisierte Konstante. Für die gelten halt Einschränkungen.
![]() Sherlock |
AW: Konstante in Konstante
Übrigens eins der Dinge die mich am meisten in Delphi aufregen. Du kannst nicht mal ein
Delphi-Quellcode:
-Statement über eine "typisierte Konstante", geschweige denn einen String machen.
case
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... |
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:
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.
const
*a1: String = 'a'; *a2 = String('a'); *a3 = 'a'; |
AW: Konstante in Konstante
Zitat:
|
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; |
AW: Konstante in Konstante
Und nicht vergessen: Es gibt einen
![]() J+ bzw. {$WRITEABLECONST ON} Das würde bei case-Statements zu Chaos führen und deshalb sind sie nicht erlaubt.
Delphi-Quellcode:
ist intern etwas anderes als
Case x of
a: ; b: ; end;
Delphi-Quellcode:
if x = a then begin
end else if x = b then begin end; |
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. |
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:
sondern eher sowas
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 ...
Delphi-Quellcode:
Ja, und sowas klappt nur, wenn die Konstanten "unveränderbar" sind, damit der Compiler quasi mit ihnen "rechnen" kann.
//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: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:06 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 by Thomas Breitkreuz