Ja, da hat man definitiv keine Garantie. Ich habe schon C-Header gesehen mit mehreren functionen. Und für jede function hatte es eine eigene C-Datei.Es ist zwar grundsätzlich die Konvention das jede .c Datei eine .h Datei hat mit gleichem Namen, aber das ist mehr aus Bequemlichkeit und es gibt keinen technischen Grund warum das so sein sollte.
Wie funktioniert h2pas
- 
				Mathias
 - Beiträge: 7090
 - Registriert: Do 2. Jan 2014, 17:21
 - OS, Lazarus, FPC: Linux (die neusten Trunk)
 - CPU-Target: 64Bit
 - Wohnort: Schweiz
 
Re: Wie funktioniert h2pas
Mit Java und C/C++ sehe ich rot
- 
				Warf
 - Beiträge: 2227
 - Registriert: Di 23. Sep 2014, 17:46
 - OS, Lazarus, FPC: Win10 | Linux
 - CPU-Target: x86_64
 
Re: Wie funktioniert h2pas
Bitte nicht so... ich weiß gar nicht wo ich anfangen soll...corpsman hat geschrieben: Do 30. Okt 2025, 05:45 *g* passend zum Thema habe ich gestern meinen Artikel FPC_and_others veröffentlicht, in dem ich hoffentlich verständlich Zeige wie man C Quellen mit FreePascal verbinden kann, ggf ist das was für dich. Im Kern sehe ich das aber wie Theo, h2pas ist nur der Start, dann must du von Hand ran..
Zunächst einmal die nitpicks und inhaltlichen Fehler:
C ist nicht gleich C und nicht alle C funktionen werden unterstützt. Die meisten Programmiersprachen unterstützen irgendwas zwischen C89 und C99. FreePascal unterstützt z.B. nicht den Typen complex für Komplexe Zahlen den C seit C99 unterstützt, oder Anonyme Struct und Union Member die seit C11 drin sind. Auch System APIs setzen sich normalerweise auf eine C Version fest. Der POSIX Standard in der letzten Version (2024) z.B. basiert auf C17, was eine leicht überarbeitete Version von C11 ist, und nicht das aktueller C23 (was viele neue Sprachfeatures hat).FreePascal focuses on supporting C
Langer rede kurzer Sinn, nicht jeder C code lässt sich direkt nach Pascal übersetzen. C89 fast vollständig, C99 größtenteils ab da wirds etwas wackelig.
Meine Probleme mit der C-Types Unit hab ich glaube ich schon oft genug erwähnt. Einer der ganz besonders fies ist: cbool ist in FPC LongBool, was 4 bytes ist und -1 als True definiert, während in C _Bool oder bool (ab c23) 1 byte groß ist und 1 als True wert hat. Das kann zu richtig fiesen bugs führen wenn man das nicht weisare provided in the ctypes unit
Nein! Enums in C sind keine Datentypen, es sind int Konstanten. Der code:as both compilers typically represent them internally as integers starting from index 0
Code: Alles auswählen
enum WeaponType {
    WEAPON_PISTOL = 0,
    WEAPON_SHOTGUN = 1,
    WEAPON_ROCKET = 10
};Code: Alles auswählen
type WeaponType = cint;
const WEAPON_PISTOL = 0;
const WEAPON_SHOTGUN = 1;
const WEAPON_ROCKET = 10;
Doch:Bitfield data types do not exist natively in FreePascal.
Code: Alles auswählen
struct test_struct_t {
    unsigned Field1Bit: 1;
    unsigned Field2Bit: 2;
    unsigned Field6Bit: 6;
}Code: Alles auswählen
type
  TTestRec = bitpacked record
    Field1Bit: 0..1;
    Field2Bit: 0..3;
    Field6Bit: 0..63;
  end;An dieser Stelle muss man sagen hat man echt nicht schönen C code vor sich, aber um nitpicky zu sein, ruf mal SQUARE(i++) auf und schau was passiertCode: Alles auswählen
#define SQUARE(x) ((x) * (x))
Was man hoffentlich mehr in C code sieht was hier fehlt sind funktionen mit static linkage:
Code: Alles auswählen
static inline double square(double x) { return x*x; }Jain... wenn man auf Windows arbeitet hat man häufig mit der Windows Nativen stdcall Calling Convention zu tun. Die kann FPC auch, das muss man nur wissen sonst knallts wenn man den code einfach übernimmtThis ensures that the function uses the C calling convention, which is necessary for correct parameter passing and stack cleanup when interfacing with C libraries.
In dem Kapitel sind so viele Fehler insbesondere die dinge die wirklich kaputt gehen das ich da gleich noch drauf eingehen werden daher heir erst mal einen generellen Punkt: Object Files und Static Libraries sind keine C/C++ Artifakte, sie sind teil des ELF Formats was die System ABI für Unix und Linuxsysteme darstellt. Das heißt das sind nicht nur irgendwelche dinge die aus dem C Buildprozess rausfallen, sondern sind Teile der Unix und Linux Systemspec. Deswegen funktioniert das ja auch so gut dagegen zu linken.Integrating Intermediate Compilation Artifacts (.a, .o)
Das ist auch der Grund warum es auf Windows deutlich komplizierter ist, weil Windows das Portable Executable Format verwendet. MSys oder Cygwin emulieren Linux Tools auf Windows, was allerdings auch bedeutet das diese Compiler nicht so gut auf Windows sind.
Die angehängten C beispiele sind unfassbar seltsam. Die meisten davon sind C++ code, aber nur die letzte Datei benutzt C++ features, die anderen benutzen das C subset von C++... aber nicht ganz korrekt:["C" Sources...]
Code: Alles auswählen
#include <cstdio>
void print_HelloWorld_from_a(void)
{
    printf("Hello World from a.\n");
}Code: Alles auswählen
#include <stdio.h>
void print_HelloWorld_from_a(void)
{
    printf("Hello World from a.\n");
}Code: Alles auswählen
#include <cstdio>
void print_HelloWorld_from_a(void)
{
    std::printf("Hello World from a.\n");
}Die verwendung von shell scripten als Buildsystem ist definitiv möglich, aber sehr ungewöhnlich. Normalerweise nutzt man ein richtiges Buildsystem wie Makefiles oder für C++ explizit CMake, die sind auch noch Platform unabhängig, dann brauchst du keine .bat und .sh datei. Dein Buildsystem übersetzt wäre in etwa so etwas (aus dem Kopf geschrieben, nicht getestet):[Das Buildsystem]
Code: Alles auswählen
CXX:=g++
CXXFLAGS:=-g -Wall
SOURCES:=$(wildcard C/*.cpp)
OBJECTS:=$(patsubst C/%.cpp, lib/%.o, $(SOURCES))
lib/%.o: C/%.cpp
    $(CXX) $(CXXFLAGS) -c $< -o $@
obj/shared_o.o: lib/shared_o.o
    mv $< $@
obj/shared_a.a: lib/shared_a.o
    ar rcs $@ $<
 
%.so: lib/%.o
    $(CXX) -fPIC -shared -o $@ $<
all: obj/shared_o.o obj/shared_a.a shared_lib1.so shared_lib2.so
    true
Sooo... das Oben waren nur die nitpicks und kleineren Fehler, Kommen wir jetzt mal zu den sachen die wirklich kaputt sind. Beginnen wir hier mal mit dem Offensichtlichen: Runtimes.
Viele Sprachen haben Runtimes so auch C++, diese initialisieren z.b. die felder:
Code: Alles auswählen
extern "C" int test;
static int foo = 4;
int test = foo+3;
Code: Alles auswählen
{$Link ctest.o}
var test: Integer; external;
begin
  WriteLn(test);
end.D.h. wie in deinem Beispiel C++ Code statisch zu linken ist sehr gefährlich. Man muss die entsprechenden Initalisierungsroutinen (bei dem Beispiel oben müsste das die Funktion "_GLOBAL__sub_I_test" aus dem Objektfile) manuell aufrufen.
Das nächste ist ABI stabilität oder das fehlen davon... GLibC und die STDLib von C++ sind nicht ABI stabil. Wenn du dir also deine Object Files auf einer Maschine mit einer GCC Version baust und sie auf einer anderem Maschine mit anderer GLibC version linkst, kann das sehr schnell in die Hose gehen. Noch mehr sogar ist das Speicherlayout von C++ klassen Implementationsdefiniert, und kann sich theoretisch zwischen Compiler (versionen) oder sogar Compilersettings unterscheiden.
Du hängst im Repo die statische Version von der Microsoft C runtime an die ist afaik sogar tatsächlich ABI stabil (Microsoft ist da etwas stringenter als GNU), aber die libstdc++ geh ich von aus ist die von GNU. D.h. wenn jemand das versucht und nicht genau deine Compiler Version benutzt kanns krachen.
D.h. bei C, da C keine code basierte Runtime hat (sowas wie der initalisierungscode in C++) kann funktionieren, aber mit sehr vielen caveats. C++ außer man weiß ganz genau was man tut, sollte man beim statischen linken die Finger von lassen.
Zu guter letzt:
Schau ich dochmal in die sh datei:Execute install_libshared1_so.sh
(If this step is skipped, the debugger will crash because the implicid binded library is missing.)
Code: Alles auswählen
sudo cp libshared1.so /usr/libErstens, wenn dann symlinken nicht hartkopieren. Aber selbst das, man wirft nicht einfach Dateien in seinen /usr/lib ordner, insbesondere wenns code ist den man nicht kennt. Benutz LD_LIBRARY_PATH stattdessen.
Zusammengefasst: Du musst da einiges korrigieren, allein inhaltlich. Die offensichtlich ChatGPT generierten Listen und co will ich gar nicht ansprechen. Ich weiß das AI Emojis und pro-contra listen liebt, aber sie blähen alles nur auf und machen verteilen die Informationen mehr als sie einen gewinn bringen.
Zum Inhalt: Statisches verlinken von ELF Object Files und Archiven (deshalb .a übrigens) ist extrem gefährlich und kompliziert. Wenn die person nicht bereits schon sehr gut sich mit C auskennt sollte man es nicht nutzen, und wenn man sich sehr gut mit C auskennt braucht man diesen Aritkel nicht.
Am besten einfach rauslassen und sich dafür mehr auf Dynamische Bibliotheken konzentrieren. Die sind relativ idiotensicher (also wenn man mal von dem Faux pas mit /usr/lib absieht) und sind der Weg wie man es machen sollte.
- 
				Mathias
 - Beiträge: 7090
 - Registriert: Do 2. Jan 2014, 17:21
 - OS, Lazarus, FPC: Linux (die neusten Trunk)
 - CPU-Target: 64Bit
 - Wohnort: Schweiz
 
Re: Wie funktioniert h2pas
Dies habe ich auch schon festgestellt, Auch gibt es Sachen wie Float128. Teileweise kann man solches nachbilden, aber spätestens mit Writeln scheitert es. Man kann aber Sachen wie printf einfach von C anbinden.C ist nicht gleich C und nicht alle C funktionen werden unterstützt. Die meisten Programmiersprachen unterstützen irgendwas zwischen C89 und C99. FreePascal unterstützt z.B. nicht den Typen complex für Komplexe Zahlen den C seit C99 unterstützt,
Hier habe ich mich für die Konstanten Version entschieden, auch wen das Pascal enum schöner aussieht. Aber will man solche Pascal enum dann mit or Verküpfen, dann geht die casterrei los, was echt scheusslich ist.Nein! Enums in C sind keine Datentypen, es sind int Konstanten. Der code:
Die geht, sogar ohne Kopfrechnen.Code: Alles auswählen
struct test_struct_t { unsigned Field1Bit: 1; unsigned Field2Bit: 2; unsigned Field6Bit: 6; }
Code: Alles auswählen
type
  TTestRec = bitpacked record
    Field1Bit: 1 shl 1 - 1;
    Field2Bit: 3 shl 3 -1;
    Field6Bit:6 shl 6 - 1;
  end;Mit Java und C/C++ sehe ich rot
- 
				wennerer
 - Beiträge: 645
 - Registriert: Di 19. Mai 2015, 20:05
 - OS, Lazarus, FPC: Linux Mint 20 Cinnamon,Lazarus 2.2.6 (rev lazarus_2_2_6) FPC 3.2.2 x86_64-linux-
 - CPU-Target: x86_64-linux-gtk2
 
Re: Wie funktioniert h2pas
zunächst vielen Dank für alle Antworten. Ich hab da erstmal viel zu lesen und zu verdauen.
Viele Grüße
Bernd
- 
				Warf
 - Beiträge: 2227
 - Registriert: Di 23. Sep 2014, 17:46
 - OS, Lazarus, FPC: Win10 | Linux
 - CPU-Target: x86_64
 
Re: Wie funktioniert h2pas
Ja also Pascal Enums sind viel besser (insbesondere wenn man {$ScopedEnums On} einstellt) aber wenn man C code benutzt muss man sich leider an die C spielregeln halten.Mathias hat geschrieben: Fr 31. Okt 2025, 18:39 Hier habe ich mich für die Konstanten Version entschieden, auch wen das Pascal enum schöner aussieht. Aber will man solche Pascal enum dann mit or Verküpfen, dann geht die casterrei los, was echt scheusslich ist.
Ich glaube du meinstMathias hat geschrieben: Fr 31. Okt 2025, 18:39 Die geht, sogar ohne Kopfrechnen.Code: Alles auswählen
type TTestRec = bitpacked record Field1Bit: 1 shl 1 - 1; Field2Bit: 3 shl 3 -1; Field6Bit:6 shl 6 - 1; end;
Code: Alles auswählen
type
  TTestRec = bitpacked record
    Field1Bit: 1..1 shl 1 - 1;
    Field2Bit: 1..1 shl 2 -1;
    Field6Bit: 1..1 shl 6 - 1;
  end;- 
				Mathias
 - Beiträge: 7090
 - Registriert: Do 2. Jan 2014, 17:21
 - OS, Lazarus, FPC: Linux (die neusten Trunk)
 - CPU-Target: 64Bit
 - Wohnort: Schweiz
 
Re: Wie funktioniert h2pas
Hast recht, das ist wen man blind Eintippt.Ich glaube du meinst
Je nach Header kann man die Pascal enum verwenden. Aber zB. für GST ist es eine Katastrophe. Leider ist GST welches bei FPC dabei ist so blöd übersetzt. Das braucht es voll idiotische casts. Faort werden enum mit or verknüpft.Ja also Pascal Enums sind viel besser (insbesondere wenn man {$ScopedEnums On} einstellt) aber wenn man C code benutzt muss man sich leider an die C spielregeln halten.
Mit Java und C/C++ sehe ich rot
- corpsman
 - Lazarusforum e. V.
 - Beiträge: 1664
 - 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: Wie funktioniert h2pas
Danke für die vielen Hinweise, aus meiner Sicht ist der Artikel damit ein Voller Erfolg, denn ich lerne da nun noch sehr viel dazu, während ich versuchen werde alle deine Punkte ein zu arbeiten.Warf hat geschrieben: Fr 31. Okt 2025, 18:05Bitte nicht so... ich weiß gar nicht wo ich anfangen soll...corpsman hat geschrieben: Do 30. Okt 2025, 05:45 *g* passend zum Thema habe ich gestern meinen Artikel FPC_and_others veröffentlicht, in dem ich hoffentlich verständlich Zeige wie man C Quellen mit FreePascal verbinden kann, ggf ist das was für dich. Im Kern sehe ich das aber wie Theo, h2pas ist nur der Start, dann must du von Hand ran..
Ja ich habe ChatGTP bei der Übersetzung genutzt (hab alles in deutsch vor geschrieben und die KI hat dann übersetzt). Die Emoji's finde ich nicht störend im Gegenteil sie lockern den Langen Text auf, hier werden wir uns wohl nicht einig
Du bist auch herzlich eingeladen, via PR Verbesserungen ein zu pflegen
Just try it
- 
				Mathias
 - Beiträge: 7090
 - Registriert: Do 2. Jan 2014, 17:21
 - OS, Lazarus, FPC: Linux (die neusten Trunk)
 - CPU-Target: 64Bit
 - Wohnort: Schweiz
 
Re: Wie funktioniert h2pas
Ich habe den Artikel auch kurz gelesen, da ist auch die Stolper falle mit dem cbool. In meinen Augen ist die ein Bug in ctypes. Ich habe schon mehrere Header übersetzt und da war der bool immer 8Bit. Ich weis nicht wie die Entwickler auf die Idee gekommen sind den cbool auf 32bit zu setzen. Es gibt noch ein ganz gemeiner, der "long". Bei Linux ist der 64bit und bei Windows ist er 32bit. Auch der wchar_t muss man genau anschauen, da geht nicht einfach der widechar von FPC.Danke für die vielen Hinweise, aus meiner Sicht ist der Artikel damit ein Voller Erfolg, denn ich lerne da nun noch sehr viel dazu, während ich versuchen werde alle deine Punkte ein zu arbeiten.
Code: Alles auswählen
Ja ich habe ChatGTP bei der Übersetzung genutzt (hab alles in deutsch vor geschrieben und die KI hat dann übersetzt). Die Emoji's finde ich nicht störend im Gegenteil sie lockern den Langen Text auf, hier werden wir uns wohl nicht einig ;).Bei h2pas ensteht eine gewisse Hassliebe. Man muss die Maken des Tools kennen, das ist es recht praktisch. Ich wollte mal reingucken, ob man es verbessern könnte, aber der Code ist total unübersichtlich. Ich hätte nie gedacht, das die so komplex sei.
Mit Java und C/C++ sehe ich rot
- corpsman
 - Lazarusforum e. V.
 - Beiträge: 1664
 - 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: Wie funktioniert h2pas
Ich habe auch eine eigene h2pas variante geschrieben, und mein Code ist so schlecht, dass ich mich bisher nicht getraut habe den unter meinem Namen zu veröffentlichenMathias hat geschrieben: Sa 1. Nov 2025, 08:42 Bei h2pas ensteht eine gewisse Hassliebe. Man muss die Maken des Tools kennen, das ist es recht praktisch. Ich wollte mal reingucken, ob man es verbessern könnte, aber der Code ist total unübersichtlich. Ich hätte nie gedacht, das die so komplex sei.
Just try it
- 
				Mathias
 - Beiträge: 7090
 - Registriert: Do 2. Jan 2014, 17:21
 - OS, Lazarus, FPC: Linux (die neusten Trunk)
 - CPU-Target: 64Bit
 - Wohnort: Schweiz
 
Re: Wie funktioniert h2pas
Ich denke, man würde weiter kommen, wen man von Grund aus etwas neues machen würde.Ich habe auch eine eigene h2pas variante geschrieben, und mein Code ist so schlecht, dass ich mich bisher nicht getraut habe den unter meinem Namen zu veröffentlichen.
Aber sowas braucht natürlich einiges an Zeit.
Der erste Schritt würde sein, sämtliche Kommentare aus dem C-Code entfernen. Nur das ist schon ein harter Brocken. Aber da ja gcc dies auch machen muss, gibt es vielleicht ein fertiges Modul dazu.
Mit Java und C/C++ sehe ich rot
- corpsman
 - Lazarusforum e. V.
 - Beiträge: 1664
 - 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: Wie funktioniert h2pas
Just try it
- 
				Mathias
 - Beiträge: 7090
 - Registriert: Do 2. Jan 2014, 17:21
 - OS, Lazarus, FPC: Linux (die neusten Trunk)
 - CPU-Target: 64Bit
 - Wohnort: Schweiz
 
Re: Wie funktioniert h2pas
Code: Alles auswählen
gcc -E forms.h -o forms_no_commend.hDafür werden aber sämtliche abhängige Header noch mit eingebunden, Wen man den Anfang seines Header kennt, kann man oberhalb alles rauslöschen.
Vielleicht kann man dies auch mit regex machen. ODer mit g_regex, welche bei glib2 dabei ist.
Mit Java und C/C++ sehe ich rot
- 
				Warf
 - Beiträge: 2227
 - Registriert: Di 23. Sep 2014, 17:46
 - OS, Lazarus, FPC: Win10 | Linux
 - CPU-Target: x86_64
 
Re: Wie funktioniert h2pas
Das ganze Thema ist gar nicht mal so leicht, vor allem wegen vielen der kleinen Eigenheiten von C die Pascal so nicht hat. Eine sache z.B. C unterscheidet zwischen Funktions und Funktionspointer typen. D.h. die Folgende Pascal Definition:
Code: Alles auswählen
type
  TMyProc = procedure(AValue: Integer); cdecl;Code: Alles auswählen
typedef void (*myprocptr_t)(int); // Direktes äquivalent
// oder
typedef void (myproc_t)(int); // Funktionsdefinition
typedef *myproc_t myprocptr_t; // Pointer zu Funktion- 
				Mathias
 - Beiträge: 7090
 - Registriert: Do 2. Jan 2014, 17:21
 - OS, Lazarus, FPC: Linux (die neusten Trunk)
 - CPU-Target: 64Bit
 - Wohnort: Schweiz
 
Re: Wie funktioniert h2pas
Code: Alles auswählen
typedef void (*myprocptr_t)(int); // Direktes äquivalent
// oder
typedef void (myproc_t)(int); // FunktionsdefinitionMit Java und C/C++ sehe ich rot
- 
				wennerer
 - Beiträge: 645
 - Registriert: Di 19. Mai 2015, 20:05
 - OS, Lazarus, FPC: Linux Mint 20 Cinnamon,Lazarus 2.2.6 (rev lazarus_2_2_6) FPC 3.2.2 x86_64-linux-
 - CPU-Target: x86_64-linux-gtk2
 
Re: Wie funktioniert h2pas
wer (trotz der Verbesserungsvorschläge) die Demo von corpsman testen möchte und auf das gleiche Problem wie ich
stößt möchte ich folgendes mitteilen.Warning: linker: /usr/bin/ld: -lstdc++ kann nicht gefunden werden: Datei oder Verzeichnis nicht gefunden
Zunächst hab ich nach einer *-dev gesucht und auch mehrere Verionen gefunden und installiert. Hat leider nichts gebracht. Dann hab ich von Hand einen Symlink erstellt:
Hat auch nicht funktioniert (was ich nicht verstehe).sudo ln -s -f /lib/x86_64-linux-gnu/libstdc++.so.6.0.33 /usr/bin/libstdc++.so
Letztlich hab ich den Symlink in dem Ordner der Executablen erzeugt und das geht:
Falls jemand eine bessere Lösung kennt bitte posten.sudo ln -s -f /lib/x86_64-linux-gnu/libstdc++.so.6.0.33 /home/......../Research-main/Content/FPC_and_others/libstdc++.so
Viele Grüße
Bernd