Autor Beitrag
ASMFreak
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 53
Erhaltene Danke: 9



BeitragVerfasst: Fr 09.07.10 08:10 
Hallo,

Warum haben Aufzählungen mit "Löchern" in den Ordnungszahlen keine TypInformation?

Wenn man ein Set definiert über

ausblenden Delphi-Quelltext
1:
2:
type 
  TMySet = (Element1, Element2, Element3, Element31=31);


meckert der Compiler beim Aufruf von EnumName (Unit Typinfo), dass keine Typinformationen verfügbar sind. Läßt man die "31" weg:

ausblenden Delphi-Quelltext
1:
2:
type 
  MySet = (Element1, Element2, Element3, Element31);


gibt's offensichtlich TypInformationen. Es stören den Compiler also die Löcher zwischen Ordnungszahl 3 und 30. Warum? Git's 'ne Lösung, außer, die Elemente bis 31 mit Dummies aufzufüllen?

Gruß, Trutz

_________________
Und aus dem Chaos sprach eine Stimme zu mir: Lächle und sei froh, es könnte schlimmer kommen.
Und ich lächelte und ich war froh – und es kam schlimmer!
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Fr 09.07.10 10:51 
Das Problem ist, dass die VCL vollkommen undurchdacht herangeht ... Intern werden bei den Properties nämlich nur ein Array von STrings verwaltet und ne zugehörigen Werte. Die VCL arbeitet also für "NextValue" praktisch mit nem +1, statt den nächsten WErt wirklich zu lesen.

Vollständige Typinfos wären aber an vielen andren Stellen auch mal schön: Pointer, Records, Klassen, ...

Ich hab mich mal dran versucht, sowas zu emulieren: VErgiss es.
Man bekommt mit dem elphi Compiler noch nicht mal die Constante NIL mit Typinfos emuliert, wenn man den Typ VOID beschreiben muss ;-) Also nicht ohne Laufzeit-Source ...

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
mkinzler
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 4106
Erhaltene Danke: 13


Delphi 2010 Pro; Delphi.Prism 2011 pro
BeitragVerfasst: Fr 09.07.10 11:05 
RTTI wurde in D2010 aber stark erweitert

_________________
Markus Kinzler.
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Fr 09.07.10 11:53 
Ich kenn noch die Situation von D7; D2005 sah aber auch noch nicht viel besser aus.

Zumindest alles, was neu an Features zur Sprache hinzugefügt wurde, war meist nicht sauber über die RRTI abrufbar.

Warum das aber für Enums mit Lücken nicht geht, ist fraglcih, weil die doch schetwas länger supported werden.

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.

Für diesen Beitrag haben gedankt: ASMFreak
Martok
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 3661
Erhaltene Danke: 604

Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
BeitragVerfasst: Fr 09.07.10 12:11 
user profile iconBenBE hat folgendes geschrieben Zum zitierten Posting springen:
Die VCL arbeitet also für "NextValue" praktisch mit nem +1, statt den nächsten WErt wirklich zu lesen.

Das zeigt sich auch, wenn man diese Menge mit Succ/Pred durchwandern will: man könnte auch einfach Inc/dec nehmen, da Lücken vollständig ignoriert werden.

Interessanterweise erkennt der Debugger das Problem durchaus und zeigt den Hinweis "Außerhalb des zuässigen Bereichs", wenn man eine solche Variable überwacht.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
program Project2;
{$APPTYPE CONSOLE}
type
  Enum = (en1, en2, en5=5);
var e: Enum;
begin
  e:= en1;
  Writeln(Ord(e));
  e:= succ(e);
  Writeln(Ord(e));
  e:= succ(e);
  Writeln(Ord(e));
  e:= succ(e);
  Writeln(Ord(e));
  Readln;
end.

e überwachen, durchsteppen, staunen.

Eigentlich nutzt der Debugger doch aber auch RTTI?
Vielleicht kann man da was bauen. Aufzählungen können ja nur 256 Elemente haben, das kann man ja noch Bruteforcen ;)

EDIT: Achja, die Lösung vom Ganzen: auch Borland deklariert aus diesem Grund oft Arrays[Datentyp] of String, wo genau die Namen nochmal drin stehen. Dazu ein Iterator, um das Mapping andersrum zu machen...

_________________
"The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
ASMFreak Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 53
Erhaltene Danke: 9



BeitragVerfasst: Fr 09.07.10 18:14 
Danke Euch allen für die Antworten

Gruß, Trutz

_________________
Und aus dem Chaos sprach eine Stimme zu mir: Lächle und sei froh, es könnte schlimmer kommen.
Und ich lächelte und ich war froh – und es kam schlimmer!