![]() |
Umgang mit Single und Real
Hi
Ich habe mir eine Reihe von Mathematikfunktionen programmiert, die alle mit Real arbeiten. Jetzt möchte ich die Funktionen in Form einer DLL auch in C# nutzen und MUSS dort (leider) den Datentyp Float nutzen. Jetzt ist es so, daß Float in C# dem Datentyp Single in Delphi entspricht. Und Double (C#) entspricht Real (Delphi). Zwei mögliche Lösungen sind mir eingefallen: 1. Die exportierten Funktionen der Delphi-DLL nutzen den Datentyp Single und arbeiten trotzdem mit den Mathematikfunktionen, die Real nutzen. 2. Ich erstelle nochmal alle Mathematikfunktionen, diesmal mit dem Datentyp Single und lasse, je nach Compilerdirektive, mit Single oder Float kompilieren. (die schon bestehenden Mathematikfunktionen möchte ich ungern ändern) Was meint Ihr dazu? Danke Gargi Edit: In C++ hatte ich mal gesehen, daß man sich eigene Datentypen erstellen kann, die auf normalen Datentypen basieren. Auf diese Weise konnte man plattformübergreifend programmieren, ohne ständig überall am Code Änderungen vorzunehmen. Wäre das eine Lösung für mein Problem? |
AW: Umgang mit Single und Real
Ich habe mal die dritte Lösung ausprobiert. Der Delphi-Compiler meckert zumindest erstmal nicht.
Delphi-Quellcode:
unit Unit_dwDatastructures;
interface type gargi = real; Vec3D = record x,y,z:gargi; end; Vec2D = record x,y:gargi; end; implementation end. |
AW: Umgang mit Single und Real
Real ist äußerst ungeeignet, da er keinem bestimmten Typ entspricht, sondern ein generischer Typ ist. Überspitzt gesagt sagst du damit dem Compiler: "Nimm irgendeinen Typ mit Nachkommastellen, welcher ist mir egal."
Insbesondere für Schnittstellen sollte man daher grundsätzlich konkret Single (4 Byte), Double (8 Byte) usw. benutzen, da es dort sehr wichtig ist, dass ein konkreter Typ benutzt wird. |
AW: Umgang mit Single und Real
Zitat:
|
AW: Umgang mit Single und Real
Zitat:
Und wenn irgendwo mit {$REALCOMPATIBILITY ON} die Kompatibilität eingeschaltet wird, ist es z.B. kein Double mehr, sondern Real48. Fazit: Am besten nie Real benutzen, es sei denn der Datentyp ist wirklich absolut egal. |
AW: Umgang mit Single und Real
Zitat:
Zitat:
|
AW: Umgang mit Single und Real
Zitat:
|
AW: Umgang mit Single und Real
OK, danke erstmal. Dann werde ich mir in Zukunft Real verkneifen und immer Single bzw. Double verwenden.
Aber was ist mit Lösung 3? (zweiter Post) |
AW: Umgang mit Single und Real
Genauso ungeeignet, also wenn du da Real letztendlich wieder als Typ verwendet.
Real, String, Char, PChar, Integer, Cardinal, NativeInt und NativeUInt sollte/darf man niemals für eine externe modul- und systemübergreifende Kommunikation, sowie zum Speichern verwenden, denn das sind alles generische Typen. Für externe Daten sind statische Typen aber extrem wichtig. War sehr leicht zu merken, als mi Delphi 2009 PChar und String urplötzlich Unicode wurden, was keiner ahnen konnte, obwohl schon seit unzähligen Jahren bekannt war, daß diese Typen nicht statisch sind. Genauso wie damals der Integer von 16 auf 32 Bit wuchs und eigentlich auch auf 64 Bit gewachsen währe ... währe da nicht ein I*** auf die Idee gekommen den einzufrieren und stattdessen z.B. den NativeInt zu erfinden. Aber es kann seine Vorteile haben, wenn man eine Typen selber deklariert, da man diese später sehr leicht ändern kann, sollte es unbedingt nötig sein und muß dabei nur eine einzige Stelle ändern. |
AW: Umgang mit Single und Real
Ja, klar. Posting 2 hatte noch real drin, da mir erst später gesagt wurde, daß ich lieber Double nehmen soll.
Aber das mit PChar verstehe ich nicht. Die Übergabe von Zeichenketten hatte auf diese Weise immer sehr gut funktioniert. |
AW: Umgang mit Single und Real
Zitat:
|
AW: Umgang mit Single und Real
Zitat:
(P)Char ist ab D2009 ein 2-Byte (besser gesagt (UTF16)) Character. D.h. wenn du mit einem D2009 PChar eine DLL aufruftst die ein 1-Byte PChar erwartet wird diese fast immer nur 1 Zeichen auslesen. |
AW: Umgang mit Single und Real
Falls du das mit den generischen Typen noch nicht ganz verstanden hast ... das sind nur "Umleitungen", bzw. ist ein Alias für einen anderen Typen.
Bis Delphi 2007 und in FreePascal/Lazarus: Char = AnsiChar PChar = PAnsiChar String = AnsiString Ab Delphi 2009 Char = WideChar PChar = PWideChar String = UnicodeString Also genauso wie Real, was aktuell ein Alias für Double ist. |
AW: Umgang mit Single und Real
Dann werde ich bei der Gelegenheit nicht nur Real in Double abändern, sondern gleich noch integer in Longint.
Wenn ich nun aber mit C# arbeite, wo das .net-Framework verwendet wird, sollte ich bei Übergabe von Zeichenketten AnsiString oder doch lieber WideString nehmen? |
AW: Umgang mit Single und Real
Zitat:
Seit bekannt war, daß es bald endlich mal 64 Bit gibt, hab ich spätestens angefangen, den Integer so einzusetzen, wie es gut ist. Also da Integer, wo es mal 64 werden kann und dort wo es 32 Bit bleiben muß, wurde LongInt eingesetzt ... also genau so, wie es mal gedacht war. Im Gegensatz zum PChar hatte der Integer schonmal die 16-32-Bit-Grenze überschritten, also hätte man es da doch besser wissen müssen? Toll, jetzt ist das Integer überall kaputt. PS: Damit sind nun auch alle Integer<>Pointer-Konvertierungen futsch. Zitat:
Der ist eine Umleitung/Kapselung von ![]() ![]() ![]() ![]() Es ist also praktisch in nahezu allen Programmiersprachen verfügbar, welche die WinAPI nutzen. |
AW: Umgang mit Single und Real
Zitat:
![]() Ein managed Umgebung muss sowas unabhängig vom Zielsystem festlegen. Zitat:
![]() |
AW: Umgang mit Single und Real
Danke Euch allen. Jetzt bin ich wieder auf Kurs.
|
AW: Umgang mit Single und Real
Zitat:
Und mit dem aufkommen von Managed Umgebungen hätte man auch ahnen können das diese Mitwachsen irgendwann aufgegeben wird. So gibt es eigentlich keine Bestrebungen den String-Datentyp auf 4-Byte aufzubohren (nötig wäre es ja seit ein paar Jahren seit dem die Unicode Base Plane nicht mehr ausreicht). Glücklicherweise hat sich Delphi hier an den Rest der Programmierwelt angepasst und unter 64-Bit den Integer-Typ bei 4 Byte gelassen. Sonst hätte es in diesem Umfeld wieder größere Probleme gegeben. Zitat:
|
AW: Umgang mit Single und Real
Zitat:
Die Entscheidung Integer bei 32-Bit zu belassen bedeutet gleichzeitig, dass man an manchen Stellen keinerlei Möglichkeit hat, denselben Code für alte und neue Delphiversionen zu benutzen. Hätte man ihn auf 64-Bit mitwachsen lassen, hätte ausschließlich fehlerhafter Code nicht mehr funktioniert. Genau so wie es bei PChar und PAnsiChar / PWideChar der Fall ist. Deshalb halte ich das auch für eine Fehlentscheidung, schlechte Programmierung zu unterstützen und guten Code nicht zu ermöglichen... |
AW: Umgang mit Single und Real
Zitat:
Zitat:
Zitat:
|
AW: Umgang mit Single und Real
Zitat:
Nun muss man aber jeden Code durchforsten, bei dem man von der eigentlichen Selbstverständlichkeit, dass Integer nach dem Schritt zu 32-Bit auch bei dem zu 64-Bit mitwächst, ausgegangen ist. Ich habe z.B. genau aus diesem Grund schon seit Jahren Integer an solchen Stellen benutzt und LongInt usw. bei Schnittstellen. Aber das war ja nun alles für die Katz. Zitat:
Zitat:
Und da Embarcadero sich ja schon eher an professionelle Entwickler mit dem entsprechenden Kleingeld richtet, sollte man dann sich bei solchen Entscheidungen dann auch an diejenigen richten, die wissen was sie tun. Und nicht, ohne jemandem zu nahe treten zu wollen, an die, die so etwas eben erst noch lernen müssen... das ist ja nix Schlechtes, sollte aber nicht diese Entscheidungen beeinflussen. |
AW: Umgang mit Single und Real
Zitat:
Zitat:
Zitat:
Oder kennst du eine (relevante) Programmiersprache dessen Haupt-Integertyp von 32-Bit nach 64-Bit gewachsen wäre? |
AW: Umgang mit Single und Real
Zitat:
Ist es denn dort auch so, dass es einen generischen Integertypen gibt, der von 16-Bit auf 32-Bit gewachsen ist, aber von 32-Bit auf 64-Bit nicht? Bei C# wüsste nicht welcher das sein sollte, int war schließlich immer 32-Bit und ist auch kein generischer Typ. C++ kenne ich nicht gut genug um das sagen zu können. |
AW: Umgang mit Single und Real
Zitat:
|
AW: Umgang mit Single und Real
Zitat:
Zitat:
Zitat:
|
AW: Umgang mit Single und Real
Zitat:
ich hoffe, das >>"nur"<< war ganz bewusst gewählt... :wink: Wenn ich mich recht entsinne, war ein int unter Turbo C noch ein 2 Byte Datentyp... Da war long der "große" 4 Byte-Typ. GNU C++ in der 486er Zeit, da war int schon 4 Bytes groß, allerdings auch long. Gleiche Zeit und auf dem Alpha war long dann 8 Bytes groß. :wall: Also seeehr plattformabhängig und füllte den Quelltext mit vielen Compilerdirektiven... VG Pixfreak |
AW: Umgang mit Single und Real
Letztlich bringt es nix darüber groß zu diskutieren, jeder muss mit der Entscheidung leben. Mag er sie schlecht finden wie ich oder gut wie andere.
Insofern belasse ich das mal dabei, meine Meinung dazu habe ich ja genau genug erklärt. |
AW: Umgang mit Single und Real
Zitat:
Zitat:
Wahrscheinlich auch ein Grund wieso man diese mitwachsen der Datentypen mehr oder minder aufgibt. Beim wechsel von 16 auf 32-Bit waren solche Busbreiten-Anpassen performancetechnisch noch sehr zwingend. Heutzutage kommen auch 64-Bit Prozessoren mit 32-Bit Integer ganz gut zurecht so das das hier nicht mehr ins Gewicht fällt. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:16 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz