Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Aufzählung- und Mengentype (https://www.delphipraxis.net/133773-aufzaehlung-und-mengentype.html)

Bomberbb 8. Mai 2009 11:31


Aufzählung- und Mengentype
 
Ich melde mich mal wieder mit einem Problem:

Ich möchte eine Änderung in einem bestehendem Programm machen, wo es folgende Definitionen gibt:
Delphi-Quellcode:
  teinszwei=(eins,zwei);
  tdreivier=(drei,vier);
nun möchte ich das ganze zuweisungskompatibel gestalten und hab mir gedacht, ich löse das so:
Delphi-Quellcode:
  teinsvier=(eins,zwei,drei,vier);
 
  teinszwei=eins..zwei;
  tdreivier=drei..vier;
Nun kommt mein Problem: Die Zuweisungskompatibilität ist zwar gegeben, aber dafür gibt es ein anderes Problem:

tdreivier(0) ist eins; und da standardmäßig mit 0 initialisiert wird, werden alle variablen vom typ tdreivier mit eins initialisiert. Da das ganze Programm riesig ist und mit Sicherheit nicht alle Variablen manuell initialisiert werden...

himitsu 8. Mai 2009 11:42

Re: Aufzählung- und Mengentype
 
Zitat:

tdreivier(0) ist eins;

tdreivier müßte mit (2) initialisiert werden,
oder besser noch mit mit Low(tdreivier) ... falls du mal wieder was änderst :angel:


Ja und wo ist nun eigentlich genau das Problem?
Derartige Typen müssen doch so oder so schon immer initialisert werden, da dieses nicht automatisch von Delphi gemacht wird.
(es sei den die Variable ist in einem Objekt definiert, welches standardmäßig mit Nullen initialisiert wird)

Bomberbb 8. Mai 2009 12:06

Re: Aufzählung- und Mengentype
 
ja bei so wie es jetzt war wurde tdreivier automatisch mit drei initialisiert, jetzt mit eins. Leider kann ich nicht davon ausgehen, dass alle variablen von tdreivier explizit initialisiert wurden und ca. 1000 Vorkommen dieser Variablen im Quelltext zu inititalisieren ist doch sehr aufwendig...
Ich dachte, es gäbe eine andere Möglichkeit so etwas zu definieren...

himitsu 8. Mai 2009 12:17

Re: Aufzählung- und Mengentype
 
Neeee, eine andere Möglichkeit gibt es nicht,

denn wenn es bisher "automatisch" Initialisiert wurde, dann wurde nicht Variable explizit initialisiert, sondern sie war rein zufällig an einer Stelle definiert, welche (wie z.B. der Variablenspeicher bei Objekten) global initialisert wurden
und da wird meißt nur alles mit 0 gefüllt.

Dir bleibt also keine andere Möglichkeit als dieses überall per Hand zu initialisieren.


Der einzige alternative Ausweg wäre
Delphi-Quellcode:
teinsvier = (undefiniert, eins, zwei, drei, vier);
aber da müßtest du dann eventuell an anderen Stellen wiederum prüfen, ob der Wert definiert bzw. richtig initialisiert wurde.

Bomberbb 8. Mai 2009 12:39

Re: Aufzählung- und Mengentype
 
Ich glaube, dann werde ich die 'undefiniert'-Lösung nehmen.

Danke

Stevie 8. Mai 2009 12:46

Re: Aufzählung- und Mengentype
 
Die Frage, die sich mir stellt, ist, warum du TEinsZwei und TDreiVier zuweisungskompatibel machen möchtest, wenn die Wertebereiche dieser beiden Typen sowieso unterscheiden. Du wirst den Wert aus einer Variablen des einen Typen niemals in eine Variable des anderen Typen schreiben können ohne die Wertebereiche zu verletzen.

himitsu 8. Mai 2009 12:50

Re: Aufzählung- und Mengentype
 
so könnte man z.B. Werte für Beides in nur einem Parameter übergeben?
z.B. wie bei dwFlagsAndAttributes in MSDN-Library durchsuchenCreateFile ... da gibt's Attribute, Flags und SecurityFlags

Stevie 8. Mai 2009 15:12

Re: Aufzählung- und Mengentype
 
Darauf zu vertrauen, dass die Werte die in nicht (bzw "automatisch") initialisierten Variablen stehen korrekt sind, halte ich persönlich für sehr gefährlich.
Deshalb würde ich die Finger davon lassen, diese Typen zu ändern und eher Funktionen für die Stellen schreiben, wo man eine Kompatibilität dieser Typen haben möchte.


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:52 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