Konflikt bei Round(), Trunc() usw. zwischen mathh.inc und gencurr.inc

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Nimral
Beiträge: 390
Registriert: Mi 10. Jun 2015, 11:33

Konflikt bei Round(), Trunc() usw. zwischen mathh.inc und gencurr.inc

Beitrag von Nimral »

Hi,

ich habe versucht, das Projekt CAD2D von Git (CADSys42-master\Demos\CAD2D) zu kompilieren (WIndows 10 x64, Lazarus 2.0.10 x64). Der Compiler meldet einen Overload-Konflikt

"CS4DXFModule.pas(824,42) Error: Can't determine which overloaded function to call"

bei einem Aufruf der Round() funktion.

Andere mathematische Functionen wir Trunc() verhalten sich ebenso.

gencurr.inc(17,14) Hint: Found declaration: Trunc(Currency):Int64;
mathh.inc(117,14) Hint: Found declaration: Trunc(Double):Int64; InternProc;

Ich verstehe, denke ich, so ungefär, wo da Problem herkommt: man hat versucht, einen Datentype "Currency" einzuführen, der aber auf meiner Plattform auf "Double" gemappt wird, und damit haben wir den Salat.

Ich vermute weiterhin, dass dieses Problem sofort verschwindet, wenn ich auf Lazarus 32-Bit umsteige, soweit ich einige Posts rund um das Flag FPC_CURRENCY_IS_INT64 verstanden habe, das ebenfalls mitmischt.

Gibt es auch eine andere Möglichkeit, dieses Problem zu lösen, ohne auf Lazarus x32 zu wechseln?

Armin.

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: Konflikt bei Round(), Trunc() usw. zwischen mathh.inc und gencurr.inc

Beitrag von PascalDragon »

Nimral hat geschrieben:
Di 2. Feb 2021, 12:54
Ich verstehe, denke ich, so ungefär, wo da Problem herkommt: man hat versucht, einen Datentype "Currency" einzuführen, der aber auf meiner Plattform auf "Double" gemappt wird, und damit haben wir den Salat.
Nicht ganz. Currency ist letztlich intern ein 64-bit Integer, der allerdings unter x86 Platformen (i8086, i386, x86_64) von der FPU behandelt wird, also dort auf Extended gemappt ist, mit Ausnahme von x86_64-win64. Auf nicht-x86 Systemen sowie eben für x86_64-win64 ist Currency tatsächlich auf Int64 gemappt. Das Problem ist nun, dass der Compiler Probleme damit hatte einen Currency, der dort intern ein Int64 ist, auf Round(Single) oder Round(Double) anzuwenden. Dies ist einerseits im Trunk von FPC behoben und wird auch im nächsten Release 3.2.2 gefixt sein.
Nimral hat geschrieben:
Di 2. Feb 2021, 12:54
Gibt es auch eine andere Möglichkeit, dieses Problem zu lösen, ohne auf Lazarus x32 zu wechseln?
Entweder du kompilierst für 32-bit oder du installierst dir die Fixes Version 3.2.1 von FPC (zum Beispiel mit Hilfe von fpcupdeluxe).
FPC Compiler Entwickler

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: Konflikt bei Round(), Trunc() usw. zwischen mathh.inc und gencurr.inc

Beitrag von wp_xyz »

Bitte mache genauere Angaben. Wo ist das Problem einen exakten Link in die Nachricht zu kopieren?

Ich habe nach CAD2D gesucht und bin auf https://tenado.de/de/produkte/tenado-cad/tenado-cad-2d/ gelandet, einer kommerziellen Seite, die keinen github-link enthält. Im zweiten Versuch habe ich nach ""CS4DXFModule" gesucht, und da kam ich auf https://github.com/michalgw/CADSys42, wo es auch tatsächlich einen Ordner demos\CAD2D gibt. Aber das enthaltene Projekt kompiliert unter Laz 2.0.10x64 und Laz-trunk-x64 auf Win10x64 einwandfrei, genauso wie die beiden anderen Beispielprojekte.

Nimral
Beiträge: 390
Registriert: Mi 10. Jun 2015, 11:33

Re: Konflikt bei Round(), Trunc() usw. zwischen mathh.inc und gencurr.inc

Beitrag von Nimral »

@PascalDragon

wie Du schon vermutet hast, unter 32 Bit geht das Projekt tadellos durch. Da mir 64 Bit sowieso nichts bringt, bleibe ich dabei.

Danke für den Hinweis auf dem Fix, den kannte ich nicht, und die Hinweise zu den technischen Hintergründen - "again what learned" :-)

HG, Armin.

Antworten