![]() |
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:
Normalerweise klappt das ja ziemlich gut aber in meinem Fall habe ich TFPInstruction so definiert:
var
L2 : TFPInstruction; begin L2 := TFPInstruction(GetEnumValue(TypeInfo(TFPInstruction), 'fpiMOV_REG_REG')); end;
Delphi-Quellcode:
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
TFPInstruction = (
fpiMOV_REG_CONST = $a0, fpiMOV_REG_REG = $a1, {...} ); Der Fehler beim kompilieren ist:
Code:
Vielen Dank und freundliche Grüsse
[dcc32 Fehler] fMain.pas(41): E2134 Typ 'TFPInstruction' besitzt keine Typinformation
|
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. |
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 |
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:
Ein "leerer" Name ist also das Ende.
TFPInstruction = (
fpiMOV_REG_CONST, fpiMOV_REG_REG ); 'fpiMOV_REG_CONST'#0'fpiMOV_REG_REG'#0#0 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. |
AW: "Keine Typinformationen" von Enum Type. Was könnte ich tun?
Zitat:
Code:
#16'fpiMOV_REG_CONST'#14'fpiMOV_REG_REG'
|
AW: "Keine Typinformationen" von Enum Type. Was könnte ich tun?
OT: Was bastelst du? Sieht interessant aus? :stupid:
|
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. |
AW: "Keine Typinformationen" von Enum Type. Was könnte ich tun?
Zitat:
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 |
AW: "Keine Typinformationen" von Enum Type. Was könnte ich tun?
Zitat:
|
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...) :)
|
AW: "Keine Typinformationen" von Enum Type. Was könnte ich tun?
Zitat:
Vielen Dank! ^^ Zitat:
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 |
AW: "Keine Typinformationen" von Enum Type. Was könnte ich tun?
Zitat:
|
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. |
AW: "Keine Typinformationen" von Enum Type. Was könnte ich tun?
Zitat:
Delphi-Quellcode:
definieren und dann statt fpiXXX cFPInstructionValues[fpiXXX] benutzen:
const
cFPInstructionValues: array[TFPInstruction] of Integer = ( (*fpiMOV_REG_CONST*)$A0, (*fpiMOV_REG_REG*)$A1 );
Delphi-Quellcode:
Edit: Ich würde den Enum auch nicht explizit bei 0 beginnen lassen, sondern ganz "normal" definieren:
var
fpi: TFPInstruction; //... for fpi := Low(TFPInstruction) to High(TFPInstruction) do Writeln(cFPInstructionValues[fpi]);
Delphi-Quellcode:
type
TFPInstruction = ( fpiMOV_REG_CONST, fpiMOV_REG_REG ); |
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:
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:
Jeder fängt mal klein an und du willst gar nicht wissen wie lange ich schon auf das Vorhaben hinarbeite. ;) Freundliche Grüsse |
AW: "Keine Typinformationen" von Enum Type. Was könnte ich tun?
Zitat:
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 ;) |
AW: "Keine Typinformationen" von Enum Type. Was könnte ich tun?
Zitat:
Ich dachte das liegt einfach an der Schweiz. :gruebel: Freundliche Grüsse |
AW: "Keine Typinformationen" von Enum Type. Was könnte ich tun?
Zitat:
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. |
AW: "Keine Typinformationen" von Enum Type. Was könnte ich tun?
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:04 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz