![]() |
Hat Delphi Probleme mit static Variablen?
Hallo all!
Ich programmiere momentan mal wieder etwas durch die Gegend, und dabei ist mir folgendes aufgefallen: Kann es sein, dass Delphi Probleme damit hat, static Variablen auseinanderzuhalten? Zuerst mal worum geht es? Sprachen wie C++ unterstützen sogenannte static Variablen, das sind Variablen, die ihren Wert auch dann nicht verlieren, wenn die Funktion verlassen wird. Delphi bietet diese Variablen nicht direkt an, man kann aber ein ähnliches Verhalten erzeugen, indem man zuweisbare typisierte Konstanten verwendet (muss man für den Compiler explizit einschalten). Ich habe draufhin mal folgendes programmiert:
Delphi-Quellcode:
Die Idee hinter dieser Programmierung war, so etwas wie ein Statusflag für die Prozedur zu erzeugen. Der obige Versuch scheitert. TestStat, obwohl in beiden Prozeduren lokal definiert wird offensichtlich wie eine globale Variable verwendet. Ändert sich der Wert von TestStat in Test1, ändert sich der Wert von TestStat in Test2 auch und umgekehrt. Ich habe das auf den gleichen Namen zurückgeführt und daraufhin folgendes programmiert:
procedure Test1;
const TestStat : Boolean = TRUE; begin if Bedingung1 then TestStat := TRUE else TestStat := FALSE; end; procedure Test2; const TestStat : Boolean = TRUE; begin if Bedingung2 then TestStat := TRUE else TestStat := FALSE; end;
Delphi-Quellcode:
Das kuriose ist jetzt aber, dass trotz der unterschiedlichen Namen TestStat1 und TestStat2 gleich behandelt werden, d.h. ändert sich TestStat1, ändert sich TestStat2 auch automatisch. Hat von Euch schon jemand mal versucht so etwas zu programmieren? Ich weiss jetzt auch nicht, ob der Fehler bei mir oder bei Delphi liegt. Schon mal vielen Dank für (zahlreiche) Antworten.
procedure Test1;
const TestStat1 : Boolean = TRUE; begin if Bedingung1 then TestStat1 := TRUE else TestStat1 := FALSE; end; procedure Test2; const TestStat2 : Boolean = TRUE; begin if Bedingung2 then TestStat2 := TRUE else TestStat2 := FALSE; end; Viele Grüsse Frank :coder: |
Re: Hat Delphi Probleme mit static Variablen?
es kann sein das ich dich nicht verstehe, aber was macht es einen sinn einen Schalter als Konstante zu vereinbaren?
|
Re: Hat Delphi Probleme mit static Variablen?
Zitat:
Also der Sinn, den ich hier verfolge ist es, eine Art "globale" Variable auf Prozedurebene zu haben, d.h. eine Variable, die ihren Wert nicht verliert, wenn man die Prozedur verlässt aber ausserhalb der Prozedur nicht sichtbar ist. Natürlich kann man dazu eine komplett globale Variable deklarieren (was unschön ist). Meine "globale" Variable soll nur im Scope der Prozedur sichtbar sein, in der sie definiert ist (sowas wie ein Merker, der an der Prozedur hängt). Wie ich in meinem Eingangs-Posting geschrieben habe unterstützen andere Sprachen wie C++ solche Konstrukte als statische Variable. Delphi selbst unterstützt keine statischen Variablen, man kann aber typisierte, zuweisbare Konstanten erzeugen, die sich ähnlich verhalten (siehe Code). Damit der Code läuft muss man in den Compiler-Eigenschaften noch einstellen, dass zuweisbare typisierte Konstanten verwendet werden sollen (unter Projekt->Optionen->Compiler). Ansonsten meckert Delphi (zu Recht) die Zuweisungsoperationen für die Konstante an. Viele Grüsse Frank |
Re: Hat Delphi Probleme mit static Variablen?
Hallo frankg!
Ich kenne static variablen aus C++ mit folgenden Bedeutungen. Zum einen kann eine static Variable die Gültigkeit innerhalb einer Quelltextdatei anzeigen, oder auf ein Attribut einer Klasse angewendet die Variable als Klassenvariable definieren, heißt die Varaible gehört dann nicht zur Instanz der Klasse, sondern zur Klasse selbst. Bei Objekt Pascal kommt es meines Wissens nach darauf an, ob Du eine Variable im interface oder im implementation Teil definierst. Im interface Teil hat die Variable global Gültigkeit, im implementation Teil ist die Variable nur innerhalb der unit gültig. Allerdings gibt es in Object Pascal die Möglichkeit Klassenfunktioninen zu definieren, das ist dann ganz ähnlich wie in c++ o. java. Aber nochmal in Kürze, wenn Du die Deklaration deiner Boolean Variable in den implementationsteil deiner unit packst, dann ist das so wie eine statis variable in c++. Gruss, Franz. |
Re: Hat Delphi Probleme mit static Variablen?
Hi,
:oops: ok, glaube ich habs jetzt verstanden.Glaube aber mich daran errinnern zu können, das man keine Variablen die in einer Prozedur vereinbart worden sind, global zu verwenden, kann mich aber auch täuschen. :( Ich bin dir nicht grad ne große Hilfe, oder? wenn ich hier nur Vermutungen anstelle. |
Re: Hat Delphi Probleme mit static Variablen?
Hallo nochmal Zusammen!
Langsam kapier ich es nicht mehr. Also zusammengefasst meinte ich folgendes:
Delphi-Quellcode:
Hier wäre die Variable Form1 für eine andere unit sichtbar, die Variable Form1NurFuerUnit aber nicht. Wenn ich eine nichtglobale Variable haben wollte, die nur für die Funktionen der einen unit sichtbar sein soll würde ich sie in den Implementationsteil stecken.
unit Unit1;
interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs; type TForm1 = class(TForm) private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; // ist nach aussen sichtbar implementation var Form1NurFuerUnit: TForm1; // ist nur innerhalb des implementationsteils // der unit sichtbar {$R *.DFM} end. Gruss, Franz. |
Re: Hat Delphi Probleme mit static Variablen?
Zitat:
Grüsse Woki |
Re: Hat Delphi Probleme mit static Variablen?
Zitat:
Was das Phänomen mit den lokalen Konstanten anbelangt: Könnte es sein, dass diese Konstanten bei jedem Aufruf der Prozedur erneut initialisiert werden und deshalb als static-Ersatz ungeeignet sind? |
Re: Hat Delphi Probleme mit static Variablen?
Zitat:
Als Hinweise: - Das Zitat stammt direkt aus der Delphidokumentation - Ich hab das nochmal schnell in einer recht frischen Delphiinstallation nachgeschaut, Default ist off. Zitat:
Grüsse Woki |
Re: Hat Delphi Probleme mit static Variablen?
seit wann nimmt man überhaupt "const" bei variablen?? "const" ist Konstant und "var" ist variabel. Da geht es doch schon theoretich nicht das man etwas constantes ändert...
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:51 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