Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi veränderbare typisierte Konstanten [typed constants] (https://www.delphipraxis.net/2517-veraenderbare-typisierte-konstanten-%5Btyped-constants%5D.html)

MaBuSE 27. Jan 2003 14:56


veränderbare typisierte Konstanten [typed constants]
 
Hallo zusammen,

ich hab mal eine Frage:

ab Delphi 6 gibt es keine "typed constants" mehr.

Ein Beispiel:
Delphi-Quellcode:
...

procedure x;
const i : integer = 0;
begin
  inc(i); // i := i + 1;
  ausgabe(i);
end;

begin
  x; x; x;
end;

...
Ausgabe:
1
2
3

Die typisierte Konstante ist also eine Art static Variable.
Sie ist nur innerhalb der Procedure sichtbar, behällt aber den Wert bei.
Das ist in vielen Situationen sehr praktisch.

Das Dumme daran ist, laut Handuch soll man das nicht mehr benutzen !
Zitat:

In der Hilfe steht dazu:
Thema: Schreibbare typisierte Konstanten

In früheren Versionen von Delphi und Borland Pascal konnten typisierte
Konstanten immer geändert werden (wie im Status {$J+}). Deshalb muß
älterer Quelltext, der änderbare typisierte Konstanten enthält, im
Status {$J+} compiliert werden. Bei neuen Anwendungen sollten Sie aber
initialisierte Variablen und den Status {$J-} verwenden.
Meine Frage:
Ich verwende dieses Konstrukt sehr gerne, gibt es sinnvolle Alternativen in D6?
Für die Antworten bedanke ich mich schonmal im Voraus...

mfg
MaBuSE

Christian Seehase 27. Jan 2003 16:03

Moin Mabuse,

das steht doch schon in Deinem Hilfezitat:

Delphi-Quellcode:
var
  i : integer = 0;

implementation

procedure x;
begin
  inc(i); // i := i + 1;
  ausgabe(i);
end;
Wenn ich das in Deinen Hilfeauszug richtig verstanden habe, kann man das mit den veränderbaren typisisierten Konstanten aber durchaus noch machen. Man muss nur unter Projekt/Optionen den entsprechenden Wert einstellen, oder die Compilerdirektive {$J+} verwenden.

Zitat:

Zitat von D6 Hilfe
Bei neuen Anwendungen sollten Sie aber
initialisierte Variablen und den Status {$J-} verwenden.

Zitat:

Zitat von Mabuse
ab Delphi 6 gibt es keine "typed constants" mehr.

Ich hatte schon einen Schreck bekommen, die benutz' ich relativ oft.
Zum Glück geht's ja auch nur um veränderbare, und die hab' ich eh' immer abgeschaltet ;-)

Sebastian Nintemann 27. Jan 2003 16:14

Hi, warum sollte man den auch Konstanten verändern wollen? Dafür sind doch die (initialisierten) Variablen da, wenn ich einen nicht konstanten Wert habe dann nutze ich doch keine Konstante. Was spricht also überhaupt dafür, dass man Konstanten ändern kann (konnte)?

Gruß, Sebastian

Christian Seehase 27. Jan 2003 16:25

Moin Sebastian,

weil das wohl die einzige Möglichkeit darstellt, lokale Variablen (eben die Konstanten) global zu initialisieren, und deren Wert auch nach verlassen noch zu behalten.

Ich persönlich find's allerdings unübersichtlich. ;-)

Luckie 27. Jan 2003 16:27

Entspricht wohl der Deklaration eine lokalen Variablen in C++ mit static.

Allerdings warum es besser sein soll dazu dann eien globale Variable zu nehmen verstehe ich nicht, denn auf die globale Variable kann man ja dann wieder von anderen Prozeduren / Funktionen zugreifen und sie versehentlich ändern. Was ja wieder eien Gefahr darstellt.

In D6 geht es noch, aber Borland rät schon davon ab, also denke ich kommt irgendwann der Moment, wo Borland das ganz rausnimmt, denke ich.

Brüggendiek 27. Jan 2003 17:54

Hallo!

Das mit den typisierten Konstanten war wohl eine Hilfslösung - die stellen in Wirklichkeit initialisierte Variablen dar.

Offensichtlich hat Borland jetzt die Konsequenzen gezogen und deklariert sowas jetzt auch korrekterweise als VAR, nicht als CONST wie früher. Da sehe ich gerade, daß bei D5 das auch schon möglich ist, aber nur für globale Variablen, während mit CONST auch lokale Variablen initialisiert werden können!

Bei einem neuen Delphi muß man natürlich auch mit ähnlichen Überraschungen rechnen. Zum Problem wird das ja nur, wenn man seine Sources mit verschiedenen Versionen benutzen muß - ggf. eben die Compilerversion auswerten - wenn die in der Hilfe korrekt angegeben ist. Meine D5 Standard ist Version 13, in der Hilfe steht allerdings 12!
Erklärung für die Versionen:
1 - 7: Turbo-Pascal bzw. Borland-Pascal
8: vermutlich Turbo-Pascal für Windows
9: Delphi 1
usw.

Mit
Code:
{$IFDEF VER130}
kann man dann bedingt und damit versionsabhängig programmieren.

Man sollte die Initialisierung beim Deklarieren (egal ob mit VAR oder CONST) wirklich benutzten - erspart doch viel Schreibarbeit.

Gruß

Dietmar Brüggendiek

MaBuSE 28. Jan 2003 12:04

Hallo,
zu allererst einmal ein Dankeschön für die Antworten.

An Christian Seehase: eine globale Variable mag ich nicht, da diese ja global ist. Die veränderbare typisierte Konstante entspricht einer static var aus dem C++ und ist nur lokal in der procedure zu sehen. {$j+} will ich nicht verwenden, da zu befürchten ist, das das auf lange Sicht abgeschafft wird (bzw Nachteile bringt)

An Grotesquery: Ich geb Dich recht, aber static Vars haben in machen Situationen auch Vorteile.

An Luckie: genau, aber gibt es in D6 static Vars ? (Das war eigentlich meine Frage, hab ich wohl nur etwas ungeschickt formuliert :angle: )

An Brüggendiek: Ich würde eine Lösung bevorzugen, die entweder in allen Delphi Versionen geht, oder falls es in D6 static Vars gibt, Deinen Lösungsvorschlag benutzen. Aber ich weiß ja immer noch nicht, wie ich das in D6 lösen kann.

An Alle :-) : Ich schreibe nochmal auf was ich wollte.

1. Var (oder veränderbare Konstante) soll nur lokal sichtbar sein. (in einer Procedure z.B.)
2. Var sollte den Wert behalten (static)
3. Es sollte nicht zu umständlich werden. (z.B. mittels Pointer auf einen "globalen" Speicherplatz zeigen, damit Var den Wert nicht verliert)
4. Von allen Delphi Versionen unterstützt werden (oder zumindest ab einer Version. Dann kann man sich ja mit {$IFDEF VER130} helfen.

Ich möchte mich nochmal für die Antworten bedanken.

mfg
MaBuSE

Christian Seehase 28. Jan 2003 12:14

Moin Mabuse,

also wenn ich das richtig verstanden habe, kannst Du es bei D6 so machen wie bisher.
Ob Du nun {$J+} benutzen willst oder nicht:
Wenn veränderliche typisierte Konstanten funktionieren, dann wird diese Direktive indirekt benutzt (CFG bzw. DOF Datei, eingestellt über die Projektoptionen).
Du kannst diese Einstellung nur durch explizite Angabe in der Unit übersteuern.

Dass das ab einer bestimmten Delphi Version funktioniert wird Dir wohl niemand garantieren können, da wohl niemand weiss, was in künftigen Delphi Versionen passiert (eventuell nicht einmal Borland)
(ggf. könnte mal jemand in D7 nachsehen, ob's da überhaupt noch geht).

Brüggendiek 28. Jan 2003 14:48

Hallo Mabuse!

Es kommt immer darauf an, was man will!

Wer alleine mit einer Delphi-Version programmiert und das Ergebnis als compilierte Datei weitergibt (EXE), schreibt seine Programme eben für die vorhandene Version und fertig is. Der verwendete Compiler ist für die fertige EXE unerheblich. Bei einem Compiler-Update muß dann eventuell etwas geändert oder eine abwärtskompatible Option gesetzt werden.

Wer (z.B. im Team) mit unterschiedlichen Delphi-Versionen programmiert und EXE weitergibt, muß sich auf einen "gemeinsamen Nenner" einigen, so daß die Sources auf allen beteiligten Compilern übersetzbar ist. Vorsicht - die DCU-Dateien sind u.U. nicht versionskompatibel, so daß jeder alle Units übersetzen muß!

Wenn Open Source programmiert wird, gibt man doch in der Regel auch die EXE weiter - nur wer etwas ändern will, braucht die Sources und idealerweise die Angabe der verwendeten Compiler-Version. Wenn dann die Version nicht kompatibel ist, sollte der Compiler meckern und der Nutzer muß das Problem selber lösen. Oder willst Du für Delphi Version 1 coden? Und was ist mit Dingen, die später ausgebaut wurden??

Wenn die Weitegabe aus irgendwelchen Gründen nur im Source erfolgen soll (bitte Lizenzbestimmungen beachten - bei der Personal erlaubt Borland nur privaten Einsatz und unentgeltliche Weitergabe - bei Source kann man die Personal nicht feststellen!!!) muß entweder die Delphi-Version angegeben oder der Anwender sich selber helfen können.


Was das Problem mit "Anwender muß selber können" betrifft: früher war es so, daß nur die einen Compiler hatten, die auch mit sowas umgehen können. Leider hat Borland ja mit D6 Personal im Download und auf Heft-CDs die Compiler auch in Hände gegeben, die nichts damit anfangen können (habe ich, also installiere ich, mal sehen, was das ist).
In den einschlägigen Foren kommen deshalb Dinge wie:
F: "wie erzeuge ich mit Delphi eine EXE?"
A: "geht automatisch beim Compilieren"
F: "Sorry - hatte bis jetzt VBA und da wird EXE nur auf Wunsch erstellt"

oder auch:
F: (irgendeine Anfängerfrage)
A: "Guck in die OH"
F: "Was heißt OH?"
A: "Online-Hilfe"
F: "Aha - hat einer mal grade den Link zur Online-Hilfe?"
A: "F1"
1.) :wall:
2.) Klar, die Generation @ versteht unter Online das Internet!

Weitergabe von Source ist immer problematisch.
Linux ist Open Source, aber wer hat die nötigen Fachkenntnisse und kann da noch was verändern?
Wenn ich bei Open Source was nach meinen Wünschen anpasse und es kommt eine neue Version, muß ich meine Anpassungen wieder neu reinstricken - also kein Update, weil viel Arbeit.

Gruß

Dietmar Brüggendiek

MaBuSE 29. Jan 2003 13:03

Zitat:

Zitat von Brüggendiek
F: (irgendeine Anfängerfrage)
A: "Guck in die OH"
F: "Was heißt OH?"
A: "Online-Hilfe"
F: "Aha - hat einer mal grade den Link zur Online-Hilfe?"
A: "F1"
1.) :wall:
2.) Klar, die Generation @ versteht unter Online das Internet!

Folgender Link sollte bei Delphi 4 (auf eng. Windows) mit Netscape funktionieren:

file:///c%7C/Program%20Files/Borland...elp/del4op.hlp

:coder:
MaBuSE

ps: just kidding


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:38 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz