![]() |
Bei der Deklaration einer Variable einen Wert definieren
Hallo Leute,
meine Frage ist kurz und knapp: Wie ist es möglich bei der Deklaration einer Variable, wie hier im Beispiel:
Delphi-Quellcode:
einen Wert wie beispielsweise 10 festzulegen?
var Variable : integer;
Delphi-Neuling |
Re: Bei der Deklaration einer Variable einen Wert definieren
Hi,
Das geht (nur) bei globalen Variablen so:
Delphi-Quellcode:
Bei lokalen Variablen oder Variablen einer Klasse geht das nicht.
var Variable : integer = 100;
|
Re: Bei der Deklaration einer Variable einen Wert definieren
Hallo Neutral General,
und wie mache ich das ohne einer globalen Variable? Gibt es da auch eine andere Möglichkeit? Delphi-Neuling |
Re: Bei der Deklaration einer Variable einen Wert definieren
Nein. Nur bei globalen Variablen ist eine derartige Initialisierung überhaupt sinnvoll (aus Maschinensprache-Sicht betrachtet). Lokalen Variablen und Feldern musst du von Hand zu gegebener Zeit einen Wert zuweisen.
|
Re: Bei der Deklaration einer Variable einen Wert definieren
Hallo ihr Beide,
danke für die Hilfe :!: Delphi-Neuling |
Re: Bei der Deklaration einer Variable einen Wert definieren
Das geht auch bei lokalen Variablen.
Allerdings heißen diese Variablen dann "Zuweisbare typisierte Konstanten" und muss in den Projectoptionen eingeschaltet werden. Ich nutze das z.B. um sicherzustellen, dass eine Procedure/Funktion nicht rekursiv aufgerufen wird.
Delphi-Quellcode:
procedure Foo();
const // <--- const nicht var ! lLock: Boolean = false; begin if lLock then exit; lLock := true; try .. .. finally lLock := false; end; end; alex |
Re: Bei der Deklaration einer Variable einen Wert definieren
Das ist dann aber keine lokale Variable mehr.
|
Re: Bei der Deklaration einer Variable einen Wert definieren
Zitat:
|
Re: Bei der Deklaration einer Variable einen Wert definieren
Eine beschreibbare Konstante. So etwas zu nutzen halte ich übriogens für schlechten Stil. Entweder ich benutze eine Variable, um damit zu arbeiten oder ich deklarier eine Konstante, weil ich einen konstanten Wert haben will.
|
Re: Bei der Deklaration einer Variable einen Wert definieren
@Delphi-Neuling:
weise einfach direkt zu Begin der Prozedur/Funktion (also gleich nach dem ersten Begin) den gewünschten Wert zu.
Delphi-Quellcode:
des sollte eigentlich die beste/einfachste Variante sein.
procedure Foo();
var xyz: Integer; begin xyz := 123; {...} end; @Zuweisbare typisierte Konstanten: So wären außerdem alle Konstantan davon betroffen, was einige Nachteile mit sich bringen kann :wall: Dann doch lieber globale Variablen (innerhalb des Implementation-Blocks haben sie auch keine Auswirkungen außerhalb der Unit) Und mit passenden Variablennamen kommt man auch sonst mit nichts in Konflikte.
Delphi-Quellcode:
implementation
{...} var Procedure_Foo_Lock: Boolean = false; procedure Foo(); begin if Procedure_Foo_Lock then exit; Procedure_Foo_Lock := true; try {...} finally Procedure_Foo_Lock := false; end; end; |
Re: Bei der Deklaration einer Variable einen Wert definieren
Zitat:
|
Re: Bei der Deklaration einer Variable einen Wert definieren
Zitat:
|
Re: Bei der Deklaration einer Variable einen Wert definieren
Zitat:
|
Re: Bei der Deklaration einer Variable einen Wert definieren
oh man, hätte ich bloß nichts gesagt..
Zitat:
Das es per Definition eine veränderbare Konstante ist, darauf habe ich ja selbst hingewiesen. Zitat:
hingehört und verwendet wird. Zitat:
Delphi-Quellcode:
dann mache ich das genau aus dem Grund, diese später ändern zu können.
const
cfgFarbe: TColor = clRed; Zitat:
"Richtige" Konstanten
Delphi-Quellcode:
können nicht verändert werden.
cFehlerColor = clRed;
alex Edit: Mit so vielen Leuten auf einmal habe ich mich ja noch nie angelegt. Fehlt mir nur noch Hagens Standpauke. ;) |
Re: Bei der Deklaration einer Variable einen Wert definieren
Deine zuweisbaren typisierten Konstanten behalten ihren Wert, nachdem die Routine verlassen wurde. Außerdem gibt es nette Effekte, falls die Routine sich irgendwann einmal selbst aufruft, da dann beide die gleiche "Variable" verändern.
|
Re: Bei der Deklaration einer Variable einen Wert definieren
Zitat:
Zitat:
Mein ![]() alex |
Re: Bei der Deklaration einer Variable einen Wert definieren
Ja. Ich wollte nur feststellen, dass diese statischen Variablen, wie sie in C heißen, eine ganz andere Funktion als lokale Variablen erfüllen. Damit sind sie für den Threadersteller keine Lösung.
|
Re: Bei der Deklaration einer Variable einen Wert definieren
Konstanten sind aber Konstanten und keine veränderlichen Variablen.
außerdem ist des {$J+} / {$WRITEABLECONST ON} mehr zur Abwärtskompatibilität vorhanden. Obwohl ich zwar auch gern mal einige "Fehler" ausnutze ... irgendwo muß man doch nicht gleich alles machen, nur weil es geht? Vorallem da durch eine unbedachte Verwendung dieser Compilerschalter sich schnell mal die Adressen auf die "Konstanten"-Inhalte ändern. Zitat:
|
Re: Bei der Deklaration einer Variable einen Wert definieren
Zitat:
Zitat:
Zitat:
Das alles wäre halbwegs akzeptabel, wenn die Delphi-Weiterentwickler nicht in ihrer unendlichen Weisheit beschlossen hätten, daß innerhalb von Prozeduren/Funktionen etc.
Delphi-Quellcode:
fehlerhaft ist, während
var myvar: mytype = myvalue;
Delphi-Quellcode:
erlaubt ist.
const myvar: mytype = myvalue;
Gruß Gammatester |
Re: Bei der Deklaration einer Variable einen Wert definieren
Dass dieses Konstrukt bei lokalen Variablen und Felder nicht funktioniert, finde ich absolut richtig. Bei globalen Variablen und Konstanten wird der Startwert einfach in einem Abschnitt des PE-Formats angegeben. Bei lokalen Variablen geht das nicht, man muss erst die Variable auf dem Stack allozieren und dann noch einen Wert hineinschreiben, was auf das selbe wie die explizite Zuweisung hinausläuft. Die Initialisierungs-Syntax würde dies verwischen.
|
Re: Bei der Deklaration einer Variable einen Wert definieren
Zitat:
Lokal vs. global hat vom Prinzip her nichts mit Lebensdauer, Initialisierung usw. zu tun. Es gibt ja auch lokale Konstanten und Funktionen? Soll das auch nicht mehr funktionieren? Lokal bedeutet, das eine Entität halt nur innerhalb einer Funktion sichtbar ist und nicht in der ganzen Unit bzw. im Programm. Außerdem: wie eine lokale initialisierte Variable "alloziert" und "belegt" wird, sollte nicht in der Sprache festgelegt werden, das ist halt Implementation durch die Kompilerentwickler, und wird auch jetzt schon eifrig verwendet: siehe Schleifen-"Variable", die nicht auf dem Stack sondern in Registern sind; und diese Register können dekrementiert werden, obwohl die Variable inkrementiert wird. Außerdem: Du hast wohl auch nichts dagegen, wenn bei Ansistrings oder Referenzcounted-Konstrukte "Die Initialisierungs-Syntax würde dies verwischen" würde. Also versucht nicht den Leuten, die bestimmte Konstruktion verwenden wollen, diese auszureden, ihr müßt sie ja nicht verwenden. Und das Pseudoargument, man muß nicht alles machen, was geht, fällt hier aus historischen Gründen auf den Urheber zurück, der "var =" benutzt. Gruß Gammatester |
Re: Bei der Deklaration einer Variable einen Wert definieren
schau dir alleine mal die Speicherbereiche an, also wo was abgelegt wird (des is wohl die am Einfachsten sichtare Auswirkung)
Delphi-Quellcode:
WritableConsts sind in Wirklichkeit auch nur Varialen und reagieren (bis auf gewisse Unterschiede) auch genauso.
const
A = 'xyz'; {$WRITEABLECONST ON} X: String = 'abc'; {$WRITEABLECONST OFF} Y: String = 'bcd'; var Z: String; begin Z := 'cde'; Caption := Format('%x %x %x %x', [Integer(@X[1]), Integer(@Y[1]), Integer(@Z[1]), Integer(@A[1])]); Vorallem im ASM-Bereich wirst'e schnell merken, daß es einen großen Unterschied zwischen Konstanten, änderbaren Konstanten und Variablen gibt ... also z.B. wo/wie der Wert einer Integers abgelegt wird. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:29 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