Delphi-PRAXiS

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...) :)

milos 14. Feb 2018 00:56

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

Zitat von Zacherl (Beitrag 1393779)
Ach cool :thumb: Eine kleine VM steht auch schon ewig auf meiner Liste, aber bisher bin ich nie dazu gekommen. Viel Erfolg!

Ist bestimmt eines der Dinge die jeder Entwickler mal auf seiner Liste stehen hat. :D
Vielen Dank! ^^

Zitat:

Zitat von Dennis07 (Beitrag 1393784)
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...) :)

Cool! Kann man sich das ansehen und ausprobieren? Würde mich sehr interessieren. :)

Der Heap bereitet mir auch ein wenig Sorgen, denke nicht dass ich den gescheit hinkriege aber ich werde mich da noch einlesen und lasse mich dann überraschen. :D Womöglich wird sich Zacherl ja auch bald zu uns gesellen. ^^

Freundliche Grüsse

Neutral General 14. Feb 2018 09:00

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

Zitat von milos (Beitrag 1393785)
Zitat:

Zitat von Zacherl (Beitrag 1393779)
Ach cool :thumb: Eine kleine VM steht auch schon ewig auf meiner Liste, aber bisher bin ich nie dazu gekommen. Viel Erfolg!

Ist bestimmt eines der Dinge die jeder Entwickler mal auf seiner Liste stehen hat. :D

Da überschätzt du die Fähigkeiten des durchschnittlichen Entwicklers aber um einiges ;)

himitsu 14. Feb 2018 09:53

AW: "Keine Typinformationen" von Enum Type. Was könnte ich tun?
 
Was du aber machen kannst, ist die andere Seite zu "reparieren",
also den ENUM mit Dummy-Werten auffüllen und den Compiler automatisch zählen zu lassen.

Alternativ noch eine Übersetzung hinzufügen. Den ENUM bei 0 beginnen und automatisch zählen lassen und dann noch ein TPairArray<TFPInstruction,Byte> mit fpiMOV_REG_CONST=$a0, fpiMOV_REG_REG=$a1 usw. füllen.

uligerhardt 14. Feb 2018 12:16

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

Zitat von himitsu (Beitrag 1393805)
Alternativ noch eine Übersetzung hinzufügen. Den ENUM bei 0 beginnen und automatisch zählen lassen und dann noch ein TPairArray<TFPInstruction,Byte> mit fpiMOV_REG_CONST=$a0, fpiMOV_REG_REG=$a1 usw. füllen.

Oder ein Konstantenarray
Delphi-Quellcode:
const
  cFPInstructionValues: array[TFPInstruction] of Integer = (
    (*fpiMOV_REG_CONST*)$A0,
    (*fpiMOV_REG_REG*)$A1
    );
definieren und dann statt fpiXXX cFPInstructionValues[fpiXXX] benutzen:
Delphi-Quellcode:
var
  fpi: TFPInstruction;
//...
for fpi := Low(TFPInstruction) to High(TFPInstruction) do
  Writeln(cFPInstructionValues[fpi]);
Edit: Ich würde den Enum auch nicht explizit bei 0 beginnen lassen, sondern ganz "normal" definieren:
Delphi-Quellcode:
type
  TFPInstruction = (
    fpiMOV_REG_CONST,
    fpiMOV_REG_REG
    );

milos 14. Feb 2018 17:44

AW: "Keine Typinformationen" von Enum Type. Was könnte ich tun?
 
Das Problem ist halt dass ich durch einen String auf das Enum zugreifen will welches dann einen bestimmten Byte Wert enthält. Somit kann ich eben nur durch den Enum Eintrag einen ganzen Befehl in den ASM compiler einbauen kann.

Der Tokenizer gibt mir folgendes:
Zitat:

"mov" "eax" "," "420"
Daraus mache ich dann einen String aus den jeweiligen Elementen: "MOV_REG_CONST".

Falls dann dieser Enum Eintrag existiert beinhaltet er auch gerade seinen Opcode (In dem Fall 0xA0) und das ermöglicht mir ganz leicht neue Befehle und Kombinationen in den Compiler einzubauen.$

Edit: Dies hab ich nun einfach ganz doff (:stupid:) durch TDictionary<string, TFPInstruction> gelöst. Vielleicht etwas übertrieben aber sind halt nur paar Zeilen. ^^

Zitat:

Zitat von Neutral General (Beitrag 1393797)
Da überschätzt du die Fähigkeiten des durchschnittlichen Entwicklers aber um einiges ;)

Naja, jeder darf Träumen und wer es auch wirklich will der wird es auch irgendwann mal schaffen. ^^
Jeder fängt mal klein an und du willst gar nicht wissen wie lange ich schon auf das Vorhaben hinarbeite. ;)

Freundliche Grüsse

Neutral General 14. Feb 2018 22:31

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

Zitat von milos (Beitrag 1393862)
Zitat:

Zitat von Neutral General (Beitrag 1393797)
Da überschätzt du die Fähigkeiten des durchschnittlichen Entwicklers aber um einiges ;)

Naja, jeder darf Träumen und wer es auch wirklich will der wird es auch irgendwann mal schaffen. ^^
Jeder fängt mal klein an und du willst gar nicht wissen wie lange ich schon auf das Vorhaben hinarbeite. ;)

Klar. Aber allein durch die Tatsache, DASS du es willst und darauf zuarbeitest bist du wahrscheinlich in den 10% der Leute die sowas machen wollen oder können ;)
Habe im bisher im RL glaube ich noch außer mir keinen weiteren Programmierer getroffen der in diesem Bereich überhaupt Interesse hatte, geschweige denn Ahnung oder der wirklich was programmiert hat.
Und als Hauptberuflicher Programmierer kenne ich da schon ein paar ;)

milos 14. Feb 2018 23:39

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

Zitat von Neutral General (Beitrag 1393882)
Habe im bisher im RL glaube ich noch außer mir keinen weiteren Programmierer getroffen der in diesem Bereich überhaupt Interesse hatte, geschweige denn Ahnung oder der wirklich was programmiert hat.
Und als Hauptberuflicher Programmierer kenne ich da schon ein paar ;)

Hmm komisch, bei mir ist es eigentlich genau der selbe Fall.

Ich dachte das liegt einfach an der Schweiz. :gruebel:

Freundliche Grüsse

Zacherl 14. Feb 2018 23:51

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

Zitat von milos (Beitrag 1393885)
Ich dachte das liegt einfach an der Schweiz. :gruebel:

Nee, liegt glaube ich größtenteils daran, dass diese System/Hardware-nahen Projekte meistens eher schwer zu Geld zu machen sind :( Solche VMs und X86->dynamicVM Tools kenne ich da eigentlich nur als Software-Protectoren und von einigen AntiCheat Systemen. Gibt definitiv einen Markt dafür, aber der ist in der Regel einfach schon fest im Griff von etablierten Produkten (in diesem Falle z.B. Themida, VMProtect, etc.). Gleiches Problem bei Reverse-Engineering Tools wie z.b. IDA.

Dann kommt sicherlich noch hinzu, dass solche speziellen Projekte deutlich mehr Fachwissen in dem jeweiligen Bereich erfordern, als z.B. nötig ist, um eine simple Mobile App zu basteln. Klar, das trifft sicherlich auch auf komplexe ERP Systeme oder auch generell Branchen-spezifische Software zu, aber auf der anderen Seite kenne ich hier ebenfalls nicht grade viele Leute, die sich jetzt aus reinem Interesse in so etwas reinarbeiten würden.

freimatz 15. Feb 2018 17:11

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

Zitat von himitsu (Beitrag 1393742)
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.

Auf uns leider auch nicht. Die fehlende RTTI Info für diese Typen ist das größte Ärgernis zu Delphi bei uns in der Firma.


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