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/)
-   -   "Keine Typinformationen" von Enum Type. Was könnte ich tun? (https://www.delphipraxis.net/195221-keine-typinformationen-von-enum-type-koennte-ich-tun.html)

milos 13. Feb 2018 01:58

Delphi-Version: 10 Berlin

"Keine Typinformationen" von Enum Type. Was könnte ich tun?
 
Hallo Freunde,

Ich versuche durch einen String das jeweilige Enum Type zu bekommen:
Delphi-Quellcode:
var
  L2 : TFPInstruction;
begin
  L2 := TFPInstruction(GetEnumValue(TypeInfo(TFPInstruction), 'fpiMOV_REG_REG'));
end;
Normalerweise klappt das ja ziemlich gut aber in meinem Fall habe ich TFPInstruction so definiert:

Delphi-Quellcode:
  TFPInstruction = (
    fpiMOV_REG_CONST = $a0,
    fpiMOV_REG_REG   = $a1,
    {...}
  );
Es scheint als würde Delphi keine Typinformationen zur Laufzeit mitliefern wenn die Enumeration NICHT bei 0 beginnt und Lücken hat, das habe ich so erfolgreich getestet. Ist dies trotzdem irgendwie möglich oder muss ich da wohl drum herum arbeiten? Wäre nämlich schon ziemlich praktisch wenn dies so gehen würde. :D

Der Fehler beim kompilieren ist:
Code:
[dcc32 Fehler] fMain.pas(41): E2134 Typ 'TFPInstruction' besitzt keine Typinformation
Vielen Dank und freundliche Grüsse

Dennis07 13. Feb 2018 05:01

AW: "Keine Typinformationen" von Enum Type. Was könnte ich tun?
 
Enums mit Lücken oder jene, die nicht bei 0 starten haben keine TypInfo.
Der Grund hier ist recht einfach: Der Typ existiert zur Laufzeit nämlich überhaupt nicht mehr, sondern wird zur Designzeit in einen Standard-Ordinal aufgelöst und die Zugriffe so umgeschrieben, dass sie dann zu den entsprechenden Werten passen. Sprich: Eine Aufzählung, die nicht dem Standardformat entspricht, ist in wirklichkeit gar keine Aufzählung sondern wird vom Compiler in Ordinalzahlen gewrappt. Also keine Typinfo.
Eine Erweiterung der System.TypInfo wird dir hier auch nicht helfen, da für den Typen ja nicht nur die Typeinfo nicht gelesen werden kann, sondern sie auch aus dem oben genannten Grund gar nicht erst erzeugt werden kann (sagt die Fehlermeldung im Grunde auch schon).
Also zu deiner Frage: Nein, es ist schlichtweg nicht möglich. Die einzige Möglichkeit, die Ginge, wäre, mit einem eigenen ordinalen Aliastypen und entsprechend typisierten Konstanten zu arbeiten.

milos 13. Feb 2018 05:21

AW: "Keine Typinformationen" von Enum Type. Was könnte ich tun?
 
Alles Klar, vielen Dank für die genauere Erklärung warum dies nicht geht, habe mir schon so etwas in diese Richtung gedacht. Naja, ist kein Weltuntergang und wohl sowieso besser so.

Sind ja nur 10 Zeilen mehr. :P

Freundliche Grüsse

himitsu 13. Feb 2018 11:58

AW: "Keine Typinformationen" von Enum Type. Was könnte ich tun?
 
Nee, umgewappt werden keine Werte,
aber der eigentliche Grund ist noch einfacher.

In der TypeInfo sind die Namen der einzelnen Werte des ENUMs in einer #0-terminierten Liste gespeichert und das Ende diese Liste ist eine #0#0 Doppelnull.

Delphi-Quellcode:
  TFPInstruction = (
    fpiMOV_REG_CONST,
    fpiMOV_REG_REG
  );
 
'fpiMOV_REG_CONST'#0'fpiMOV_REG_REG'#0#0
Ein "leerer" Name ist also das Ende.
Und wenn etwas fehlt, dann gibt es dort keinen Namen und somit ist es nicht möglich diese Liste für solche ENUMs aufzubauen.

Vor vielen vielen Jahren hatte ich im QC mal vorgeschlagen, das Fehlende einfach mit einem Dummy-Char oder dem ordinalen Wert (Zahl) aufzufüllen, aber auf mich hört ja niemand.

Stevie 13. Feb 2018 14:06

AW: "Keine Typinformationen" von Enum Type. Was könnte ich tun?
 
Zitat:

Zitat von himitsu (Beitrag 1393742)
In der TypeInfo sind die Namen der einzelnen Werte des ENUMs in einer #0-terminierten Liste gespeichert und das Ende diese Liste ist eine #0#0 Doppelnull.

Delphi-Quellcode:
  TFPInstruction = (
    fpiMOV_REG_CONST,
    fpiMOV_REG_REG
  );
 
'fpiMOV_REG_CONST'#0'fpiMOV_REG_REG'#0#0

Fast richtig, sie sind als packed utf8 shortstrings gespeichert, also so:

Code:
#16'fpiMOV_REG_CONST'#14'fpiMOV_REG_REG'

Zacherl 13. Feb 2018 14:56

AW: "Keine Typinformationen" von Enum Type. Was könnte ich tun?
 
OT: Was bastelst du? Sieht interessant aus? :stupid:

himitsu 13. Feb 2018 15:38

AW: "Keine Typinformationen" von Enum Type. Was könnte ich tun?
 
Wo ich zuletzt guckte, wie Delphi das ausliest, da war ich mi fast sicher es war 'fpiMOV_REG_CONST'#0'fpiMOV_REG_REG'#0#0 :gruebel:
Nach XE haben die das doch wohl nicht umgebaut. :stupid:

UTF-8 ist es erst seit 2009 ... davor ANSI, aber das stört nicht, denn das alte ANSI (ASCII, wenn man nur die erlaubten Bezeichner betrachtet) ist mit UTF-8 ja kompatibel.

milos 13. Feb 2018 20:56

AW: "Keine Typinformationen" von Enum Type. Was könnte ich tun?
 
Zitat:

Zitat von Zacherl (Beitrag 1393761)
OT: Was bastelst du? Sieht interessant aus? :stupid:

Ich arbeite an einer kleinen Virtuellen Maschine/CPU mit eigenem Instruction Set und dazugehörigem Compiler und Debugger, da mich das Thema schon seit vielen vielen Jahren brennend interessiert. :D

Ist also nur ein "kleines" Projekt zum weiter lernen. :stupid:

Das Ziel wäre dann die VM auch für Arduino (eigentlich Teensy) boards zu porten, aber sags niemandem. =D
(Programme von der SD-Karte Laden zu können ist auch schon lange mein Traum)


Freundliche Grüsse

Zacherl 13. Feb 2018 21:13

AW: "Keine Typinformationen" von Enum Type. Was könnte ich tun?
 
Zitat:

Zitat von milos (Beitrag 1393778)
Zitat:

Zitat von Zacherl (Beitrag 1393761)
OT: Was bastelst du? Sieht interessant aus? :stupid:

Ich arbeite an einer kleinen Virtuellen Maschine/CPU mit eigenem Instruction Set und dazugehörigem Compiler und Debugger, da mich das Thema schon seit vielen vielen Jahren brennend interessiert. :D

Ach cool :thumb: Eine kleine VM steht auch schon ewig auf meiner Liste, aber bisher bin ich nie dazu gekommen. Viel Erfolg!

Dennis07 13. Feb 2018 23:35

AW: "Keine Typinformationen" von Enum Type. Was könnte ich tun?
 
Witzig, genau das selbe habe ich auch vor einigen Wochen mal angefangen. Konnte einige ASM-Befehle decodieren und virtuell ausführen. Mit Registern, einer FPU, Stack und Heap (der aber nicht wirklich gut war...) :)


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