Moin!
Ich soll Records in eine Binärdatei schreiben (mit FreePascal/Windows).
Diese Datei wird womöglich eines Tages auf einem anderen System und z.B. mit einem Programm in C++ oder einer anderen Sprache wieder eingelesen.
Wenn man z.B. Integer-Werte (Int32/Int64) in die Binärdatei schreibt, ist es simpel, die Werte auf einem anderen System einzulesen (unter Berücksichtigung von Endianness).
Aber was ist mit besonderen Typen wie Single/Double? Gibt es z.B. in C++ Datentypen, die Bit-kompatibel zu Single/Double sind, so wie Delphi/FreePascal sie benutzt?
Ich vermute zwar, dass Single/Double schlichtweg CPU-nah sind und somit womöglich auch sprachübergreifend Bit-identisch sind, aber ich weiß es nicht genau.
Und was ist mit der Datumsberechnung von TDateTime? Gibt es dazu vorhandene Entsprechungen in C++ und anderen Programmiersprachen, oder ist die Delphi-TDateTime-"Formel" nur in Delphi/FP standardmäßig vorhanden?
Ich würde gerne TDateTime-Werte binär speichern und es wäre schön, wenn andere Programme (in C oder anderen Sprachen) es ohne Konvertierungsaufwand binär lesen könnten.
Wer kennt sich mit C oder anderen Sprachen aus und weiß darüber Bescheid?
Danke! Grüße, Jörg
Double/TDateTime kompatibel zu C++ ?
-
- Lazarusforum e. V.
- Beiträge: 3158
- Registriert: Di 22. Jul 2008, 19:27
- OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
- CPU-Target: 32bit x86 armhf
- Wohnort: Köln
- Kontaktdaten:
Re: Double/TDateTime kompatibel zu C++ ?
Dann hilft dir die Unit ctypes vielleicht dabei exakte Größen der Datentypen festzulegen und so explizit kompatibel mit C/C++ zu sein. Dort gibt es auch die Typen cfloat (single) und cdouble (Double).
Bzgl. der Datentypen für Datum/Uhrzeit nutzt man unter C soweit ich weiß häufig die Unix-Zeit, die du auch in FPC recht einfach konvertieren kannst.
In C++ löst man das laut kurzer Recherche wohl eher Objektorientiert: std::chrono, wobei du hier auch wieder eine Unix-Time hineingeben kannst.
Die Umrechnung des FPC TDateTime ist im Zweifelsfall aber nicht so kompliziert, solange es dokumentiert ist. Mit VBA hättest du hier keinen Bedarf, da das selbe Format verwendet wird.
Bzgl. der Datentypen für Datum/Uhrzeit nutzt man unter C soweit ich weiß häufig die Unix-Zeit, die du auch in FPC recht einfach konvertieren kannst.
In C++ löst man das laut kurzer Recherche wohl eher Objektorientiert: std::chrono, wobei du hier auch wieder eine Unix-Time hineingeben kannst.
Die Umrechnung des FPC TDateTime ist im Zweifelsfall aber nicht so kompliziert, solange es dokumentiert ist. Mit VBA hättest du hier keinen Bedarf, da das selbe Format verwendet wird.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
- Aidex
- Beiträge: 60
- Registriert: Do 24. Sep 2020, 07:02
- OS, Lazarus, FPC: Win10 64bit, Laz v2.0.10
- CPU-Target: AMD64
Re: Double/TDateTime kompatibel zu C++ ?
Danke schön!
Da ich selbst nicht in C programmiere, waren meine Fragen diesbezüglich erst mal nur theoretischer Natur.
Also muss ich die TDateTime-Formel dokumentieren, damit es in C z.B. in die Unix-Zeit konvertiert werden kann.
Alternativ könnte ich überlegen, die Roh-Werte als Packed Record in die Datei zu speichern, z.B. Jahr:Word, Monat:Byte, usw.,
dann würde in C schon mal eine Hälfte (das Dekodieren) entfallen.
Da ich selbst nicht in C programmiere, waren meine Fragen diesbezüglich erst mal nur theoretischer Natur.
Also muss ich die TDateTime-Formel dokumentieren, damit es in C z.B. in die Unix-Zeit konvertiert werden kann.
Alternativ könnte ich überlegen, die Roh-Werte als Packed Record in die Datei zu speichern, z.B. Jahr:Word, Monat:Byte, usw.,
dann würde in C schon mal eine Hälfte (das Dekodieren) entfallen.
- af0815
- Lazarusforum e. V.
- Beiträge: 6217
- Registriert: So 7. Jan 2007, 10:20
- OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
- CPU-Target: 32Bit (64Bit)
- Wohnort: Burgenland
- Kontaktdaten:
Re: Double/TDateTime kompatibel zu C++ ?
Meiner Erfahrung nach, ist Unixtime eine gute Lösung. Ich habe auf anderen Systemen immer eine Unwandlungsmöglichkeit gefunden. Bei Geräten in der Ibdustrie zB. musste ich nur einen Korrekturwert abziehen oder hinzufügen, damit der Import bzw. Export funktioniert. Ging dann auch Problemlos über Modbus und andere Protokolle.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).
- 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: Double/TDateTime kompatibel zu C++ ?
Hi!
Single, Double und Extended sind genormt nach IEEE 754:
https://de.wikipedia.org/wiki/IEEE_754
fpc hält sich an diese Norm. Wenn sich andere Compiler auch an diese Norm halten, dann ist binär-Kompatibilität gegeben.
Winni
Single, Double und Extended sind genormt nach IEEE 754:
https://de.wikipedia.org/wiki/IEEE_754
fpc hält sich an diese Norm. Wenn sich andere Compiler auch an diese Norm halten, dann ist binär-Kompatibilität gegeben.
Winni
-
- Beiträge: 732
- Registriert: Di 23. Aug 2016, 14:25
- OS, Lazarus, FPC: Windows 11
- CPU-Target: 64Bit
- Wohnort: Berlin
Re: Double/TDateTime kompatibel zu C++ ?
Zumindest beim Typ Float kann ich bestätigen, dass sie Bit kompatibel sind.
Der Typ float in "C" entspricht dem Datentyp Single in Lazarus
Diese Daten übertrage ich seriell 1 zu 1 von einem Embedded C Gerät (ARM GNU Compiler)zu einer Windows Lazarus Anwendung.
Der Typ float in "C" entspricht dem Datentyp Single in Lazarus
Diese Daten übertrage ich seriell 1 zu 1 von einem Embedded C Gerät (ARM GNU Compiler)zu einer Windows Lazarus Anwendung.
Grüße von Siro
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...
- Aidex
- Beiträge: 60
- Registriert: Do 24. Sep 2020, 07:02
- OS, Lazarus, FPC: Win10 64bit, Laz v2.0.10
- CPU-Target: AMD64
Re: Double/TDateTime kompatibel zu C++ ?
Meinen besten Dank für eure Rückmeldungen!
Das alles deckt sich mit meinen Vermutungen, aber ich hätte es selbst nicht ausprobieren können.
Danke und Grüße, Jörg
Das alles deckt sich mit meinen Vermutungen, aber ich hätte es selbst nicht ausprobieren können.
Danke und Grüße, Jörg