![]() |
Wert aus einer const-Deklaration überschreiben?!
Hallo zusammen,
heute bin ich auf eine sehr seltsame Sache gestossen. Normalerweise geht man ja davon aus, dass Werte als "const" deklariert werden weil sie eben Konstanten sind. Doch heute bin ich eines besseren belehrt worden(?) :) Folgendes Konstrukt: Unit a deklariert im interface einen const-Wert:
Delphi-Quellcode:
So weit, so gut. Nun habe ich hier aber eine zweite Unit, die im Initialization-Teil diese Konstante mit einem eigenen Wert überschreibt! Laut Debugger steht danach auch der neue Wert drin. Wie kann das sein? Und vor allem, macht das Sinn, und kann das später Probleme geben? Zur Verdeutlichung:
Unit test;
interface uses{...}; type{Typendeklarationen} const maxvalue: integer = 2500; {...}
Delphi-Quellcode:
Vielleicht hat ja jemand einen hilfreichen Kommentar dazu :)
Unit main;
interface uses {...},test; {Rest der Interface-Abteilung} implementation {...} initialization {...} test.maxvalue:=10000; {...} finalization {...} end. |
Re: Wert aus einer const-Deklaration überschreiben?!
Dies hängt von deinen Projekteinstellungen ab. Dort dann im speziellen von den Compilereinstellungen zu typisierten Konstanten. Du hast die Möglichkeit typisierten Konstanten was zu zu weisen und erhälst damit dann eine statische Variable. Ob dies nun möglich ist, legst du in den Projektoptionen/Compiler fest.
|
Re: Wert aus einer const-Deklaration überschreiben?!
Ist z.B. hilfreich wenn du einen gewissen wert nur in einer prozedur speichern willst ohne dass andere objekte,funktionen oder sonst was zugriff drauf hat.
Delphi-Quellcode:
die konstante wird also wie eine member variable behandelt ( der aktuelle wert bleibt da drin ) nur ist die sichtbarkeit der konstante durch die deklaration nur noch innerhalb der prozedur "wert".
procedure TForm1.wert( nWert : integer );
const cnWert = -1; begin cnWert := nWert + cnWert; // weitere verarbeitung... end; eine andere funktion ist z.b. das realisieren von singleton objekten...
Delphi-Quellcode:
so kann man immer über TSingleton.Instance.Funktion auf das objekt zugreifen... ohne irgendwann mal was instanzieren zu müssen... achja und in jeder unit wo die Singleton.pas eingebunden ist kann auf ein und das selbe objekt zugegriffen werden ( man verhindert eine globale variable )
class function TSingleton.Instance : TSingleton;
const coInstance : TSingleton = nil; begin if not Assigned( coInstance ) then coInstance := TSingleton.Create; result := coInstance; end; gruß Reli |
Re: Wert aus einer const-Deklaration überschreiben?!
Zitat:
|
Re: Wert aus einer const-Deklaration überschreiben?!
Na gut, mit diesen Zusatzinfos macht das Sinn. Herzlichen Dank für die ausführlichen Erläuterungen :) Bisher ging ich davon aus dass const auch const bedeutet, aber wie so oft im Leben... "das ist nicht so einfach" :mrgreen:
|
Re: Wert aus einer const-Deklaration überschreiben?!
tja wie so oft... doppeldeutigkeit ist doch ganz eindeutig :-) oder so ^^
|
Re: Wert aus einer const-Deklaration überschreiben?!
Was mir eben noch auffällt und noch nicht richtig hervorgehoben wurde: wenn die Typenangabe bei der Deklaration der Konstante weggelassen wird, dann ist die Konstante unabhängig von der Compilereinstellung konstant. Die Compilereinstellung bezieht sich nur auf typisierte Konstanten.
Delphi-Quellcode:
Const
coReallyConst = 34.4; // Typ nicht angegeben: immer konstant coNotConst : Double = 111.3; // Typ angegeben: Compilereinstellung legt fest ob konstant oder nicht. |
Re: Wert aus einer const-Deklaration überschreiben?!
Zitat:
das ist historisch bedingt: typisierte Konstanten waren, warum auch immer, die erste in Delphi verfügbare Möglichkeit Variablen zu initialisieren - war damals (Delphi 1 oder 2) auch als so beabsichtigt beschrieben, also ausdrücklich als nicht-konstant. Habe ich noch in einigen alten Programmen so drinstehen. Gruss Reinhard |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:09 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