Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - const - Datentyp angeben?


galagher - Fr 03.10.08 17:44
Titel: const - Datentyp angeben?
Hallo!

Kann mir jemand sagen, warum beides gültig ist und ob es da einen Vor- bzw. Nachteil gibt?

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
const
  clWindowColor = $00E8E8E8;
  sNotFound     = 'Nicht gefunden: ';
//oder:
const
  clWindowColor = TColor($00E8E8E8);
  sNotFound     = String('Nicht gefunden: ');

Hat die Angabe des Datentyps irgendeinen Vorteil?


Delete - Fr 03.10.08 17:47

So wie es da steht ist es ein (unnötiger) Cast in den entsprechenden Datentyp.


galagher - Fr 03.10.08 18:25

user profile iconDeddyH hat folgendes geschrieben Zum zitierten Posting springen:
So wie es da steht ist es ein (unnötiger) Cast in den entsprechenden Datentyp.

Ok, danke. Das wollte ich wissen!


Hidden - Fr 03.10.08 19:18

Hi,

Wenn du willst, dass die Konstante nicht den Standard-Datentyp hat, musst du das übrigens so machen:

Delphi-Quelltext
1:
2:
3:
4:
const
  HalloWelt: String = 'HiHo';  //unnötig
  clWindowColor: TColor = $00E8E8E8;  //ändert afaik etwas, hat aber keine Auswirkungen und kann genauso benutzt werden
  EndOfPost: PChar = 'mfG,';  //ungetestet, könnte so von einer Methode benötigt werden und man müsste erst casten


mfG,


Yogu - Fr 03.10.08 19:23

Auch bei PChars brauchst du Konstanten nicht casten. Entweder macht das Delphi automatisch, oder es ist einfach egal - ich weiß es nicht, aber es funktioniert.


galagher - Fr 03.10.08 21:00

Ich habe nur so aus Interesse getestet, was passiert, wenn man den Datentyp angibt. Und da sich nichts - weder beim Kompilieren noch im Programm - änderte, wollte ich eben wissen, ob das Sinn hat!

Danke noch mal!


Horst_H - Fr 03.10.08 21:22

Hallo,

normalerweise werden Fliesskommakonstanten als extended gespeichert und das ist bei vielen Schleifendurchläufen hinderlich, falls man sonst nur double nutzt.

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
{$APPTYPE console}
const
  TestCOnst = 1.0;
begin
  writeln(TestConst,'  ', sizeof(TestConst) );
end.
1.0000000000000000E+0000  10



Gruß Horst


BenBE - Sa 04.10.08 00:14

Man sollte zudem beachten, dass Konstanten, die wie folgt deklariert sind:


Delphi-Quelltext
1:
const ChangeMe: Integer = 42;                    

je nach Compiler-Einstellung Writeable sind, man also legitim auch

Delphi-Quelltext
1:
ChangeMe := 23;                    

schreiben darf ;-) Und dabrauch man noch nicht mal Pointer-Foo für betreiben ;-)


Yogu - Sa 04.10.08 12:42

user profile iconBenBE hat folgendes geschrieben Zum zitierten Posting springen:
Man sollte zudem beachten, dass Konstanten, die wie folgt deklariert sind: [...] je nach Compiler-Einstellung Writeable sind

Das heißt dann, dass


Delphi-Quelltext
1:
const ChangeMe: Integer = 42;                    

das gleiche ist wie


Delphi-Quelltext
1:
var ChangeMe: Integer = 42;                    

Da verstehe ich jetzt nicht wirklich den Nutzen dahinter. :gruebel:


BenBE - Sa 04.10.08 12:50

user profile iconYogu hat folgendes geschrieben Zum zitierten Posting springen:
Das

user profile iconBenBE hat folgendes geschrieben Zum zitierten Posting springen:
Man sollte zudem beachten, dass Konstanten, die wie folgt deklariert sind: [...] je nach Compiler-Einstellung Writeable sind

Das heißt dann, dass


Delphi-Quelltext
1:
const ChangeMe: Integer = 42;                    

das gleiche ist wie


Delphi-Quelltext
1:
var ChangeMe: Integer = 42;                    

Da verstehe ich jetzt nicht wirklich den Nutzen dahinter. :gruebel:

Das ist AFAIK eine Kompatibilitätseinstellung, die per Default ausgeschaltet ist. Wenn sie eingeschaltet ist, bekommt man für Schreibzugriffe auf Konstanten IIRC jedoch eine Warnung angezeigt.

Wo so etwas wichtig sein kann, ist wenn man bestimmte Datenstrukturen hat, die zwar Konstant sind, wo man jedoch keinen geschlossenen Ausdruck zu deren Definition hinschreiben kann. Ein einfaches Beispiel für soetwas ist z.B. wenn man auf Adressen anderer Variablen zugreifen muss (Speicherstrukturen), wo etwas mehr Arithmetik notwendig ist, oder man die Adresse anderer Konstanten einbeziehen muss in Daten. Diese Konstanten kann man dann im initialization-Abschnitt einer Unit initialisieren, ohne dass man auf den Vorteil von Const (nämlich die Zwischenspeicherung und einige Compiler-Optimierungen) verzichten muss.

user profile iconHidden hat folgendes geschrieben Zum zitierten Posting springen:
höchstens, dass lokale Variablen nicht initialisierbar sind.. Dann ginge das eben doch - indem man seine Variable als Konstante deklariert :nut:

Dafür sollte man das nicht einsetzen, da das Nebeneffekt-Programmierung ist ;-)


Hidden - Sa 04.10.08 12:50

höchstens, dass lokale Variablen nicht initialisierbar sind.. Dann ginge das eben doch - indem man seine Variable als Konstante deklariert :nut:

E: Bezog sich noch nicht auf BenBes Post