Double/TDateTime kompatibel zu C++ ?

Für allgemeine Fragen zur Programmierung, welche nicht! direkt mit Lazarus zu tun haben.
Antworten
Benutzeravatar
Aidex
Beiträge: 60
Registriert: Do 24. Sep 2020, 07:02
OS, Lazarus, FPC: Win10 64bit, Laz v2.0.10
CPU-Target: AMD64

Double/TDateTime kompatibel zu C++ ?

Beitrag von Aidex »

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

Socke
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++ ?

Beitrag von Socke »

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.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Benutzeravatar
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++ ?

Beitrag von Aidex »

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.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6198
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++ ?

Beitrag von af0815 »

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

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: Double/TDateTime kompatibel zu C++ ?

Beitrag von Winni »

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

siro
Beiträge: 730
Registriert: Di 23. Aug 2016, 14:25
OS, Lazarus, FPC: Windows 11
CPU-Target: 64Bit
Wohnort: Berlin

Re: Double/TDateTime kompatibel zu C++ ?

Beitrag von siro »

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.
Grüße von Siro
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...

Benutzeravatar
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++ ?

Beitrag von Aidex »

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

Antworten