AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi const <name> : <datentyp> = <wert> und case <name
Thema durchsuchen
Ansicht
Themen-Optionen

const <name> : <datentyp> = <wert> und case <name

Ein Thema von sveni2211 · begonnen am 23. Jul 2008 · letzter Beitrag vom 24. Jul 2008
Antwort Antwort
Seite 1 von 2  1 2      
sveni2211

Registriert seit: 22. Dez 2006
Ort: Friedrichroda
38 Beiträge
 
#1

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

  Alt 23. Jul 2008, 20:48
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?
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#2

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

  Alt 23. Jul 2008, 20:49
Lass doch den Typ weg.
Markus Kinzler
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#3

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

  Alt 23. Jul 2008, 21:06
Das geht doch?

Delphi-Quellcode:
const
  test:byte = 99;
begin
  case test of
    99: ;
  end;
end;
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#4

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

  Alt 23. Jul 2008, 21:18
Hallo,

versuche es so:

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

Registriert seit: 22. Dez 2006
Ort: Friedrichroda
38 Beiträge
 
#5

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

  Alt 23. Jul 2008, 21:38
Danke Hawkeye219, so geht es.
Arbeite zwar schon lange mit Delphi, aber diese Notation kannte ich ehrlich gesagt noch nicht. Funktioniert einwandfrei. Danke.
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#6

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

  Alt 23. Jul 2008, 21:42
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
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#7

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

  Alt 23. Jul 2008, 21:49
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.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
sveni2211

Registriert seit: 22. Dez 2006
Ort: Friedrichroda
38 Beiträge
 
#8

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

  Alt 23. Jul 2008, 21:59
@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.
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#9

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

  Alt 23. Jul 2008, 22:04
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.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#10

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

  Alt 23. Jul 2008, 22:05
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?!
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 11:57 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