Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi const <name> : <datentyp> = <wert> und case <name (https://www.delphipraxis.net/117702-const-name-datentyp-%3D-wert-und-case-name.html)

sveni2211 23. Jul 2008 19:48


const <name> : <datentyp> = <wert> und cas
 
Hallo.

Ich verwende Delphi 7 und habe folgendes Problem.

Wenn ich eine Konstante von einem bestimmten Typ erzeugen will, muss ich in der Definition von const ja den Datentypen angeben.
Verwende ich diesen in einem case of behauptet Delphi, die Konstante sei nicht konstant. Das ist natürlich etwas sinnfrei. Den Compiler- Schalter für zuweisbare Konstanten habe ich aus. Damit sollten meine Konstanten doch wohl wirklich konstant sein. Der Compiler läßt sich davon leider nicht überzeugen.
Ich will eine Konstante vom Typ Byte erzeugen. Lasse ich die Typangabe weg, macht mir Delpi immer shortint draus. Das will ich aber nicht. Kann ich das CASE irgendwie überreden, meinen konstante Konstante als konstant anzusehen?

Hintergrund ist, dass diese Konstante (verschiedenen Typen) zu einem Netzwerk- Handshaking gehören. Darum will ich alle Typen wirklich fest definieren. Ich bin mir nämlich nicht sicher, dass Delphi den Datentype BYTE, der übertragen werden soll, vergrößert, weil Shortint ja negativ sein kann.


Wie ist das eigentlich, wenn das Programm auf verschiedenen Rechnern ausgeführt wird. Kann ich mich da eigentlich darauf verlassen, dass die Datentypenlängen immer die selben sind, wenn ich dem Compiler die Vergabe überlasse (eben z.B. nur schreibe const <name> = <wert>), oder kann das z.B. auf einem 64 Bit Win zu einem längeren Datentypen führen als unter XP 32 Bit?

mkinzler 23. Jul 2008 19:49

Re: const <name> : <datentyp> = <wert> und
 
Lass doch den Typ weg.

omata 23. Jul 2008 20:06

Re: const <name> : <datentyp> = <wert> und
 
Das geht doch?

Delphi-Quellcode:
const
  test:byte = 99;
begin
  case test of
    99: ;
  end;
end;

Hawkeye219 23. Jul 2008 20:18

Re: const <name> : <datentyp> = <wert> und
 
Hallo,

versuche es so:

Delphi-Quellcode:
const
  Value = Byte(42);
begin
  ShowMessage (IntToStr(SizeOf(Value)));
end;
Gruß Hawkeye

sveni2211 23. Jul 2008 20:38

Re: const <name> : <datentyp> = <wert> und
 
Danke Hawkeye219, so geht es.
Arbeite zwar schon lange mit Delphi, aber diese Notation kannte ich ehrlich gesagt noch nicht. Funktioniert einwandfrei. Danke.

omata 23. Jul 2008 20:42

Re: const <name> : <datentyp> = <wert> und
 
Ok, schön das dein Problem gelöst ist. Wo da jetzt das CASE ist verstehe ich zwar nicht, ist ja auch egal. Daran sehe ich nur wieder, dass sich mir diese geheimen Dinge einfach nicht erschliessen, bin einfach zu blöd für sowas :gruebel:

Apollonius 23. Jul 2008 20:49

Re: const <name> : <datentyp> = <wert> und
 
Eine Konstante mit einem case abzufragen, ergibt nicht viel Sinn. Ich vermute daher, dass er die Konstante als Case-Label einsetzen wollte. Typisierte Konstanten werden aber in Delphi fast wie Variablen behandelt, deshalb ist dies nicht möglich.

sveni2211 23. Jul 2008 20:59

Re: const <name> : <datentyp> = <wert> und
 
@omata:

Der Quellcodeauschnitt den du geschrieben hast, funktioniert.

Das Problem taucht hier auf:

Delphi-Quellcode:
const
  test:byte = 99;
var
  i:byte;
begin
  i := 99
  case i of
    test : ;
  end;
end;
Vom Verstand her müsste das vollkommen legitim sein. Ich habe einen Byte- Wert den ich mit einem unveränderlichen Byte- Wert vergleiche. Delphi (7) meckert jedoch, das test nicht konstant sei.

Das ganze ist ein Erbe vom Delphi- Compiler. In alten Delphi- Versionen (2, ob die 3 da auch noch betroffen war bin ich mir nicht sicher, ist zu lange her) war es nun möglich, einer Konstante im Quelltext einen neuen Wert zuzuweisen.
Folgendes war also tatsächlich möglich:

Delphi-Quellcode:
const
  test : byte = 1;

...

  test := 100;
Im Fall der überschreibbaren Konstanten macht Delphi intern eine Variable aus der Konstanten in initialisiert die einfach mit dem zugewiesen Wert. Intern wird also das draus:

Delphi-Quellcode:
var
  test : byte = 1;
Und eine Variable darf in einem CASE nicht verwendet werden. Also behauptet Delphi, auch wenn in der Version explizit die überschreibbaren Konstanten abgeschaltet sind, die Konstante sei nicht konstant.
Ob das ein Fehler im Delphi- Compiler ist oder er einfach nur derart abwärts Kompatibel ist, weiß ich natürlich nicht.
Eventuell ist das in einer höheren Delphi- Version anders.


Die Variante von Hawkeye219 interpretiere ich nun so, dass die Konstante gecastet wird. Ich gebe die Variable an und sage ihr, nimm den Wert 1 vom Typ Byte. Da Delphi nun die Konstante so erweitert, dass der Datentyp vom Wert 1 rein passt, macht Delphi da nun ein Byte draus. Denn 0 kann nicht unterschritten werden, Shortint reicht nur bis 127, ist also zu kurz, da Byte bis 255 gehen kann, also wird ein Byte daraus.

Sage ich dagegen nur const <name> = 1, kann die 1 für mehrere Datentypen stehen. Angefangen von Int64 bis runter zum Shortint. Da Delphi Shortint als kleinsten Typ ansetz und die 1 da rein passt, nimmt es automatisch Shortint. Würde ich <name> = 128 setzen, wird Byte (?) genommen (oder schon Integer?). Da 128 nicht in ShortInt rein passt.
Aus irgendeinem Grund werden in Delphi die Vorzeichenbehafteten Typen vorgezogen. Also ShortInt dem Byte, Integer dem Word, LongInt dem LongWord. Warum auch immer. Nicht jeder denkt von vornherein negativ. :wink:

Apollonius 23. Jul 2008 21:04

Re: const <name> : <datentyp> = <wert> und
 
Zur Information: Typisierte Konstanten sind vollkommen verschieden von untypisierten. Untypisierte werden praktisch direkt im Quelltext aufgelöst, entsprechen also grob vereinfacht #define in C. Typisierte Konstanten sind hingegen Variablen mit der Einschränkung, dass sie im Status J- nicht direkt verändert werden dürfen. Du kannst aber mit PCardinal(@MeineTypisierteCardinalKonstante)^ := 42 den Wert ändern.

SirThornberry 23. Jul 2008 21:05

Re: const <name> : <datentyp> = <wert> und
 
In anderen Sprachen ist es auch so das Constanten nicht für Case etc. verwendet werden können.
In Delphi geht das schon, du musst nur die Angabe des Types weg lassen.
Sobald du einen Typ angibst wird es als eine Variable gewertet und vermutlich kannst du somit später diesen Wert durch patchen einer Stelle auch ändern.
Lässt man den Typ weg wird beim Compilieren überall wo die Konstante verwendet wird der Wert eingetragen und somit funktioniert es auch.
Warum willst du überhaupt den Typ angeben? Bei einer Konstante ist der Typ doch völlig egal?!


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:25 Uhr.
Seite 1 von 2  1 2      

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