AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi veränderbare typisierte Konstanten [typed constants]
Thema durchsuchen
Ansicht
Themen-Optionen

veränderbare typisierte Konstanten [typed constants]

Ein Thema von MaBuSE · begonnen am 27. Jan 2003 · letzter Beitrag vom 29. Jan 2003
Antwort Antwort
Benutzerbild von MaBuSE
MaBuSE

Registriert seit: 23. Sep 2002
Ort: Frankfurt am Main (in der Nähe)
1.837 Beiträge
 
Delphi 10 Seattle Enterprise
 
#1

veränderbare typisierte Konstanten [typed constants]

  Alt 27. Jan 2003, 14:56
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
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#2
  Alt 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 von D6 Hilfe:
Bei neuen Anwendungen sollten Sie aber
initialisierte Variablen und den Status {$J-} verwenden.
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
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Sebastian Nintemann
(Gast)

n/a Beiträge
 
#3
  Alt 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
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#4
  Alt 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.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#5
  Alt 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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Brüggendiek

Registriert seit: 13. Dez 2002
Ort: Dortmund
275 Beiträge
 
Delphi 5 Standard
 
#6
  Alt 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
Dietmar Brüggendiek
  Mit Zitat antworten Zitat
Benutzerbild von MaBuSE
MaBuSE

Registriert seit: 23. Sep 2002
Ort: Frankfurt am Main (in der Nähe)
1.837 Beiträge
 
Delphi 10 Seattle Enterprise
 
#7
  Alt 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 )

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
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#8
  Alt 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).
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Brüggendiek

Registriert seit: 13. Dez 2002
Ort: Dortmund
275 Beiträge
 
Delphi 5 Standard
 
#9
  Alt 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.)
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
Dietmar Brüggendiek
  Mit Zitat antworten Zitat
Benutzerbild von MaBuSE
MaBuSE

Registriert seit: 23. Sep 2002
Ort: Frankfurt am Main (in der Nähe)
1.837 Beiträge
 
Delphi 10 Seattle Enterprise
 
#10
  Alt 29. Jan 2003, 13:03
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.)
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


MaBuSE

ps: just kidding
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:16 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