Aufzählungstyp als String [gelöst]

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1496
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Aufzählungstyp als String [gelöst]

Beitrag von corpsman »

Servus mit einander

ich hab folgenden Code:

Code: Alles auswählen

Type
  TBlubber = (bBla, bBlu, bBle);

Function BlubberToStr(Value: TBlubber): String;
Begin
  result := 'Unknown';
  Case (value) Of
    bBla: result := 'bBla';
    bBlu: result := 'bBlu';
    bBle: result := 'bBle';
  Else Begin
      Raise exception.create('Error missing convertion');
    End;
  End;
End;
Gibt es unter FPC irgend einen Trick die BlubberToStr Function mit hilfe des Compilers zu Kriegen ohne das ich die aus implementieren muss ?

Aufgabenstellung:
Ich habe einen Aufzählungstyp und will dessen Elemente einfach als String haben. Die Umkehrfunktion dazu ist nett, aber nicht unbedingt benötigt ...

Kennt da jemand was ?
Zuletzt geändert von corpsman am Mo 3. Mai 2021, 10:12, insgesamt 1-mal geändert.
--
Just try it

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1496
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: Aufzählungstyp als String

Beitrag von corpsman »

Das Geht tatsächlich ;)

Code: Alles auswählen


uses typinfo;
Function BlubberToStr(Value: TBlubber): String;
Begin
result := GetEnumName(TypeInfo(TBlubber), ord(Value));     
end;

--
Just try it

PascalDragon
Beiträge: 825
Registriert: Mi 3. Jun 2020, 07:18
OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
CPU-Target: Aarch64 bis Z80 ;)
Wohnort: München

Re: Aufzählungstyp als String [gelöst]

Beitrag von PascalDragon »

Oder:

Code: Alles auswählen

function BlubberToStr(Value: TBlubber): String;
begin
  WriteStr(Result, Value);
end;
Dazu folgender Hinweis: bei einem Enum mit manueller Zuweisung oder Löchern gibt es keine Typinformation, das heißt das Beispiel von corpsman kann nicht kompiliert werden. In meinem Beispiel tritt eine Exception zur Laufzeit auf, falls ein nicht vorhandener Wert genutzt wird.
FPC Compiler Entwickler

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1496
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: Aufzählungstyp als String [gelöst]

Beitrag von corpsman »

das WriteStr hatte ich auch gefunden, aber mein FPC kannte das nicht, ..
--
Just try it

PascalDragon
Beiträge: 825
Registriert: Mi 3. Jun 2020, 07:18
OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
CPU-Target: Aarch64 bis Z80 ;)
Wohnort: München

Re: Aufzählungstyp als String [gelöst]

Beitrag von PascalDragon »

corpsman hat geschrieben:
Mo 3. Mai 2021, 17:25
das WriteStr hatte ich auch gefunden, aber mein FPC kannte das nicht, ..
Dann hast du aber eine sehr alte Version, da FPC dies seit 2.4.0 beherrscht. Was hattest du denn probiert?
FPC Compiler Entwickler

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1496
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: Aufzählungstyp als String [gelöst]

Beitrag von corpsman »

:lol: ja kann schon sein dass der FPC alt ist. Ich muss da nen 32-Bit FPC nehmen, weil der ein zu bindende C-Source mit dem gcc compiliert nicht mit dem 64-Bit FPC compatibel ist. Der 32-Bit code aber schon.

Der 64-Bit FPC Compiler immer mit ner internen AV ab :/ (und ja ich weis das man dem gcc sagen muss ob er als 64 oder 32 bit compilieren soll)
--
Just try it

sstvmaster
Beiträge: 575
Registriert: Sa 22. Okt 2016, 23:12
OS, Lazarus, FPC: W10, L 2.2.6
CPU-Target: 32+64bit
Wohnort: Dresden

Re: Aufzählungstyp als String [gelöst]

Beitrag von sstvmaster »

corpsman hat geschrieben:
Di 4. Mai 2021, 18:53
:lol: ja kann schon sein dass der FPC alt ist. Ich muss da nen 32-Bit FPC nehmen, weil der ein zu bindende C-Source mit dem gcc compiliert nicht mit dem 64-Bit FPC compatibel ist. Der 32-Bit code aber schon....
Also hier gibt es aktuelle 32bit fpc's: https://www.freepascal.org/download.html
Und sogar eine Trunk: https://svn.freepascal.org/cgi-bin/view ... view=roots
LG Maik

Windows 10,
- Lazarus 2.2.6 (stable) + fpc 3.2.2 (stable)
- Lazarus 2.2.7 (fixes) + fpc 3.3.1 (main/trunk)

PascalDragon
Beiträge: 825
Registriert: Mi 3. Jun 2020, 07:18
OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
CPU-Target: Aarch64 bis Z80 ;)
Wohnort: München

Re: Aufzählungstyp als String [gelöst]

Beitrag von PascalDragon »

corpsman hat geschrieben:
Di 4. Mai 2021, 18:53
:lol: ja kann schon sein dass der FPC alt ist. Ich muss da nen 32-Bit FPC nehmen, weil der ein zu bindende C-Source mit dem gcc compiliert nicht mit dem 64-Bit FPC compatibel ist. Der 32-Bit code aber schon.
Und was hindert dich daran eine aktuelle Version von FPC zu nutzen? i386 ist weiterhin eine voll unterstützte Platform (ich mein, wir unterstützen schließlich auch i8086 :P )
corpsman hat geschrieben:
Di 4. Mai 2021, 18:53
Der 64-Bit FPC Compiler immer mit ner internen AV ab :/ (und ja ich weis das man dem gcc sagen muss ob er als 64 oder 32 bit compilieren soll)
Hast du schon mal probiert ob eine aktuellere Version das vielleicht sogar behebt? Ansonsten wäre ein Bugreport gut, da solche Probleme nicht auftauchen sollten.
FPC Compiler Entwickler

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1496
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: Aufzählungstyp als String [gelöst]

Beitrag von corpsman »

Also hab nun mal nachgeschaut:

32-Bit:
Lazarus: 2.0.2
FPC-Version: 3.0.4

64-Bit:
Lazarus: 2.1.0
FPC-Version: 3.2.0

GCC-Version 10.2.0

Mein Problem ist, dass ich die Fehlermeldung im 64-Bit Compiler nicht mit Code nachstellen kann, denn ich veröffentlichen darf. Mit kleinen Beispielen funktioniert alles wunderbar, nur bei den Firmensachen geht es nicht da kommt dann der Fehler:
project1.lpr(23,1) Error: Internal error 200603061
[Edit]
Alles was ich bisher zu dem Thema finden konnte war das hier im Englischen Forum, und da steht auch keine Lösung :(

Komisch ist auch, dass der 64-Bit gcc code die Funktion Memset wohl nicht bereitstellt, ich hab das mal mittels:

Code: Alles auswählen

// void *memset(void *str, int c, size_t n)
function Memset(str:Pointer; c:cint; n:csize_t):Pointer ; cdecl public name 'memset';
begin
  result := str;
end;  
dummy mäßig gemacht..
--
Just try it

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: Aufzählungstyp als String [gelöst]

Beitrag von Winni »

Hi!

Mach mal ein "Aufräumen und Kompilieren". Das hilft bei diesem Internal Error. Hoffentlich.

Winni

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1496
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: Aufzählungstyp als String [gelöst]

Beitrag von corpsman »

Ui da compiliert er aber echt alles neu ;)

Leider bleibt der Fehler bestehen, was aber auffällt ich musste die Funktionsdeklarationen um benennen:

Code: Alles auswählen

// FPC 32
procedure COM_Params_get_param_1(param: COM_param_1_t; var p_value: cbool); cdecl public name '_COM_Params_get_param_1';


// FPC 64
procedure COM_Params_get_param_1(param: COM_param_1_t; var p_value: cbool); cdecl public name 'COM_Params_get_param_1'; // das "_" muss bei 64-Bit raus genommen werden ..

--
Just try it

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1496
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: Aufzählungstyp als String [gelöst]

Beitrag von corpsman »

So zum Thema FPX-64 und C Code ist mir nun eher zufällig der erste Durchbruch gelungen:

Der C-Compiler hat seit neustem folgende Fehlermeldung beim Compilieren der 64-Bit version gebracht:
duplicate symbol .refptr.c_index in modules Byte_handler.o and COMState.o
Diese Fehlermeldung kommt beim 32-Bit gcc compile nicht.

Nach einiger Recherche konnte ich den Fehler Fixen und auch den GCC-64 Compiler dazu bringen den Code ohne Warnung zu compilieren, und siehe da der FPC Fehler "project1.lpr(23,1) Error: Internal error 200603061" ist verschwunden und der Code lässt sich bauen ausführen und damit spass haben ;)
--
Just try it

Antworten