![]() |
Re: Hat Delphi Probleme mit static Variablen?
Zitat:
Zitat:
|
Re: Hat Delphi Probleme mit static Variablen?
Hi,
Zitat:
Das ist da gleiche als wenn Du es gleich zwischen Prozeduren und Funktionen schreiben würdest:
Delphi-Quellcode:
Die Variable sMyVar ist nur noch da verfügbar, was danach kommt, also z.B. in der Prozedur Blupp2, aber nicht in Blupp1.
procedure Blupp1;
begin // end; var sMyVar: String; procedure Blupp2; begin // end; |
Re: Hat Delphi Probleme mit static Variablen?
Zitat:
Zitat:
Zitat:
Woki |
Re: Hat Delphi Probleme mit static Variablen?
wie jetzt, soll das heißen das man auch variablen die hinter "const" definiert wurden ändern kann??? hab das no gar ni probiert da ich das von C++ her nur so kenne das es nicht änderbar ist
|
Re: Hat Delphi Probleme mit static Variablen?
Zitat:
Dinge der Art const Bezeichner = Wert sind echte Konstanten und nicht veränderbar. Aber const Bezeichner :Typ = Wert und unter Projekt|Optionen|Compiler sind zuweisbare typisierte Konstanten aktiviert, dann gehts, um Überraschungen zu vermeiden, sollte man hier aber genau wissen was man tut, und sicher sein, das man das wirklich braucht. Grüsse Woki |
Re: Hat Delphi Probleme mit static Variablen?
Zitat:
Ganz genau. Ich will eine gobale Variable mit Sichtbarkeit die auf eine Funktion beschränkt ist. Die soll im Prinzip den Status der Funktion wiederspiegeln. Aus Gründen des "least privilege" soll die Variable halt nur in der Funktion bekannt sein. Sicherlich könnte ich (als Notlösung) auch eine unit-globale Variable verwenden, mich wundert es aber trotztdem, dass das mit den typisierten Konstanten nicht so funktioniert, wie ich es programmiert habe. Viele Grüsse Frank |
Re: Hat Delphi Probleme mit static Variablen?
Hi Frank,
ich kann allerdings Dein Problem nicht reproduzieren, hab das mal mit Booleans und mit Integern probiert, und bei mir gibt es keine Prozedurübergreifende Beeinflussung.
Delphi-Quellcode:
[edit=Daniel B]Delphi-Tags korrigiert. Mfg, Daniel B[/edit]
procedure TForm1.Button4Click(Sender: TObject);
const hallo : integer =2; testbool :Boolean=true; begin hallo := hallo+1; ShowMessage(inttostr(hallo)); testbool := NOT testbool; showmessage(BoolToStr(testbool,true)); end; procedure TForm1.Button6Click(Sender: TObject); const hallo : integer =2; testbool :Boolean=true; begin hallo := hallo+1; ShowMessage(inttostr(hallo)); showmessage(BoolToStr(testbool,true)); end; |
Re: Hat Delphi Probleme mit static Variablen?
Hey Frank,
Delphi hat keine Probleme bei Namensgleichheit von Identifiern. Es gilt lediglich den Scope und Namespace (ab D7) korrekt zu verwenden. Du kannst mithilfe des Debuggers der Delphi-IDE leicht überprüfen, ob zwei (einfache) Variablen identisch sind, also den selben Speicherplatz einnehmen, indem Du ihre Adressen auf Gleichheit überprüfst. Der integrierte Debugger und die Watch List (Strg+Alt+W) eignen sich zur Laufzeit prima, wenn Du Ausdrücke der Art @myVar auswerten lässt (in der IDE Strg+F5). In diesem Beispiel:
Delphi-Quellcode:
ergibt der Ausdruck @myVar innerhalb von StaticVar42 zB den Wert @myVar:$44EBC0 und innerhalb von StaticVar127 den Wert @myVar:$44EBC4. Die beiden zuweisbaren Konstanten (assignable typed constants) nehmen also nicht den selben Speicherplaz ein und sind folglich nicht identisch.
{$J+}
procedure StaticVar42; const myVar : Integer = 42; begin Inc(myVar); end; procedure StaticVar137; const myVar : Integer = 137; begin Inc(myVar); end; procedure TForm1.Button1Click(Sender: TObject); begin Test42; Test137; end; Du kannst den integrierten Debugger nun mithilfe der ermittelten Adresse verwenden, um den Inhalt der beiden Variablen auch "von außerhalb" abzufragen, indem Du die Ausdrücke PInteger($44EBC0)^ bzw. PInteger($44EBC0)^ abfragst. Tatsächlich handelt es sich bei zuweisbaren Konstanten immer (egal ob Methode, lokale Prozedur oder global) um Variablen im Datensegment, sie sind daher auch außerhalb der Prozedur/Methode gültig (Rückgabe von Pointern auf dieser Konstanten sind zulässig) und werden von allen Threads gemeinsam verwendet. Ein
Delphi-Quellcode:
oder
static threadvar myVar = 123;
Delphi-Quellcode:
gibt es leider nicht ;(
threadconst myVar = 123;
HTH |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:19 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-2025 by Thomas Breitkreuz