Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - konstante Mengentypen durch Addition definieren


cuejo - Mi 10.01.07 17:10
Titel: konstante Mengentypen durch Addition definieren
Hi,
kurze Frage: ist sowas wie das in Zeile 5 irgendwie möglich?


Delphi-Quelltext
1:
2:
3:
4:
5:
const
  Punkt: set of char = ['*','/'];
  Strich: set of char = ['+','-'];
  Klammer: set of char = ['(',')'];
  Operatoren: set of char = Punkt + Strich;

Delphi verlangt hier einen Konstantenausdruck. Wie kann man sowas am geschicktesten definieren?


jaenicke - Mi 10.01.07 17:41

Hmm, anscheinend kann der Compiler das nicht direkt auswerten. Denn konstante Werte werden ja vom Compiler direkt ausgewertet und fest in den Code gesetzt. Diese Verknüpfung mit + kann der Compiler eben nicht bereits auswerten.
Denn damit es geht müsste der dadraus ja automatisch gleich beim Kompilieren das machen:

Delphi-Quelltext
1:
2:
3:
4:
5:
const 
  Punkt: set of char = ['*','/']; 
  Strich: set of char = ['+','-']; 
  Klammer: set of char = ['(',')']; 
  Operatoren: set of char = ['*','/','+','-'];


Wie es gehen müsste:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
var
  Form1: TForm1;
  Operatoren: set of char;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  Operatoren := Punkt + Strich;


cuejo - Mi 10.01.07 18:46


Delphi-Quelltext
1:
2:
3:
4:
5:
const
  Punkt = ['*','/'];
  Strich = ['+','-'];
  Klammer = ['(',')'];
  Operatoren = (Punkt + Strich);

Was soll das? Warum wird das hier kompiliert und das andere nicht? Wer soll denn darauf kommen? Ich hab jetzt eine Stunde herumprobiert :autsch: :motz: :evil:
Hat jemand eine Erklärung dafür?


BenBE - Mi 10.01.07 18:52

Eigentlich ganz einfach ...


Delphi-Quelltext
1:
2:
const
  A: Set of Char = ['a''b'];


definiert eine Schreibbare Konstante, die vom Compiler nicht als Konstantenausdruck anerkannt wird ...


cuejo - Mi 10.01.07 19:00

user profile iconBenBE hat folgendes geschrieben:
Eigentlich ganz einfach ...

Einfach? Ja, schon... aber nur wenn man es weiß! :roll:
Danke für eure Hilfe. Delphi macht mich irgendwann noch mal fertig. Naja, ich geh dann mal 'ne Runde heulen... :lol:


BenBE - Mi 10.01.07 19:22

user profile iconcuejo hat folgendes geschrieben:
user profile iconBenBE hat folgendes geschrieben:
Eigentlich ganz einfach ...

Einfach? Ja, schon... aber nur wenn man es weiß! :roll:
Danke für eure Hilfe. Delphi macht mich irgendwann noch mal fertig. Naja, ich geh dann mal 'ne Runde heulen... :lol:


Sagen wir's mal so: Wenn man die DOH mal durch zufall gründlich liest, stößt man früher oder später auf zwei Bemerkungen:
1. Konstanten, die über eine Typangabe deklariert werden sind schreibbare Konstanten, die zur Laufzeit geändert werden können
2. Eine Konstante kann nur mit einem Wert initialisiert werden, der zur Compile Time eindeutig berechnet werden kann.

Kombiniert man beide Aussage erhält man, dass die Angabe der Set-Of-Deklaration nicht geht, weil Delphi den Ausdruck nicht während des Compilierens berechnen kann.

Dhaer einfach ... Man brauch nur lesen *g*

Ich geb aber zu: Die beiden genannten Aussagen sind wirklich in der DOH versteckt ...


cuejo - Mi 10.01.07 21:48

user profile iconBenBE hat folgendes geschrieben:

Konstanten, die über eine Typangabe deklariert werden sind schreibbare Konstanten, die zur Laufzeit geändert werden können

Schreibbare Konstanten, die zur Laufzeit geändert werden können? Davon habe ich noch nie gehört. Ich dachte Konstanten heißen so weil sie konstant sind und eben nicht geändert werden können. Wenn ich Werte verändern will dann nehme ich doch Variablen. Oder habe ich mal wieder etwas falsch verstanden?


BenBE - Mi 10.01.07 21:59

user profile iconcuejo hat folgendes geschrieben:
user profile iconBenBE hat folgendes geschrieben:

Konstanten, die über eine Typangabe deklariert werden sind schreibbare Konstanten, die zur Laufzeit geändert werden können

Schreibbare Konstanten, die zur Laufzeit geändert werden können? Davon habe ich noch nie gehört. Ich dachte Konstanten heißen so weil sie konstant sind und eben nicht geändert werden können. Wenn ich Werte verändern will dann nehme ich doch Variablen. Oder habe ich mal wieder etwas falsch verstanden?


Ich empfehle an dieser Stelle einmal die DOH ;-) Dort steht das genauer drin ...
Schreibbare Konstanten haben aber einen ganz sinnvollen Einsatz-Zweck: Man kann damit initialisierte lokale Variablen emulieren (kann Delphi nämlich nicht). Für genauere Ausführungen sei an dieser Stelle aber auf die Object Pascal Reference verwiesen, die Teil der DOH ist ...