AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Algorithmen, Datenstrukturen und Klassendesign Inkompatible Datentypen in Procedures bei Arrays mit Double bzw. Extended
Thema durchsuchen
Ansicht
Themen-Optionen

Inkompatible Datentypen in Procedures bei Arrays mit Double bzw. Extended

Offene Frage von "enigma"
Ein Thema von enigma · begonnen am 25. Jan 2022 · letzter Beitrag vom 27. Jan 2022
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.027 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#11

AW: Inkompatible Datentypen in Procedures bei Arrays mit Double bzw. Extended

  Alt 25. Jan 2022, 10:56
Delphi-Quellcode:
  varDouble := 1.2;
  varExt := 7.3;
  arrDouble: array[0..2] of Double = (1.1, 2.2, 3.3);
  arrExt: array[0..2] of Double = (1.0, 2.0, 3.0); // <--- !!!
Falscher Typ, oder?

Und nein, auch wenn Typ X auf Typ Y zuweisungskompatibel ist, ist ein Array von X nicht auf ein Array von Y zuweisungkompatibel.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight

Geändert von Stevie (25. Jan 2022 um 10:58 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#12

AW: Inkompatible Datentypen in Procedures bei Arrays mit Double bzw. Extended

  Alt 25. Jan 2022, 13:22
Extended soll man eh nicht verwenden, somit ist es egal.
Estended war eh niemals für die direkte Verwendung/Speicherung vorgesehn.

Und beim Überladen hast mit Extended außerhalb Windows (Android/iOS/OSX) wowieso Probleme, da es diesen Typ dort nicht gibt.
OK ihn gibt es, aber er ist dort intern ein Double und schon hast mit deiner Überladung ein kleines Problemchen.



Zitat:
Delphi-Quellcode:
type
  TExtArr = array of Extended;
  TDblArr = array of Double;

procedure AcceptMe(AArr: TExtArr); overload;
procedure AcceptMe(AArr: TDblArr); overload;
Hier hast ein Problem, dass es nur genau diesen Typen annimmt und nichts Anderes.

Es ist allgemein besser, hier einen Standardtypen zu nutzen, denn so kann man dieses Array nicht nur mit der eigenen, sondern auch mit fremden Funktionen nutzen.
Delphi-Quellcode:
type TDblArr = TArray<Double>; // oder TDoubleDynArray
procedure AcceptMe(AArr: TDblArr); overload;
oder als offenes Array deklarieren,
procedure AcceptMe(AArr: array of Double); overload;
denn sowas nimmt viele Arrays an, die aus irgendeinem Array von Double bestehen,
also direkt ein Konstanten-Array ala [1.1, 2.2, 3.3] übergeben oder andere Array-Typen aus Doubles
und sogar statische Arrays ala array[0..15] of Double (siehe Post #1).
$2B or not $2B

Geändert von himitsu (25. Jan 2022 um 13:27 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#13

AW: Inkompatible Datentypen in Procedures bei Arrays mit Double bzw. Extended

  Alt 25. Jan 2022, 15:30
OK ihn gibt es, aber er ist dort intern ein Double
Na ja, so ganz stimmt das aber auch nicht: https://docwiki.embarcadero.com/RADS...hi)#Real_Types
Miniaturansicht angehängter Grafiken
25-01-_2022_15-28-24.jpg  
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#14

AW: Inkompatible Datentypen in Procedures bei Arrays mit Double bzw. Extended

  Alt 25. Jan 2022, 16:52
Intern ist der Typ "Extended" entweder 10 Byte (Extended) oder 8 Byte (Double), je nach OS und Bitigkeit.

Wie groß der Typ nach außen ist, das hängt davon ab, wie, je nach OS, der Speicher aligned wird und wie der Compiler eingestellt wurde.
Da kann er 8 bis 16 Byte sein, oder auch garnicht existieren.
{$EXTENDEDCOMPATIBILITY ON}

Hmm, OK, das mit Linux hatte ich nicht mitbekommen,
aber da es Apple praktisch nur noch als 64 Bit gibt und man den 32 Bit-iOS-Simulator (Intel) vergessen kann,
bleiben ja nur noch Win32 und Linux übrig (auf x86 ... nicht auf ARM, falls es das jemals gibt).

Ich frag mich nur, wie Linux das eigentlich machen will? (der Typ OK, aber damit auch "schnell" rechnen .. nicht wie der emulierte Int64/UInt64 im Win32)
Das war doch ein Ding der FPU und Jene gibt es in der 64 Bit-CPU (Intel/AMD) nicht mehr, sowie nicht im ARM.


Offiziell Ursprünglich (außerhalb der Pascal/Delphi-Welt) war Extended eh nie zum Speichern vorgesehn, sondern vorwiegend nur für Zwischenschritte von Berechnungen.
Aber OK, falls C-Compiler den Typ nicht kennen, dann kann man ihn auch dort teilweise aktivieren.
"long double" (80-bit double extended format) im C++, bzw. double-double damals auf PowerPC.




Nja, wird eh Zeit, dass wir Float128 (quadruple precision) im Delphi bekommen, was uns im IEEE 754 versprochen wurde.
$2B or not $2B

Geändert von himitsu (25. Jan 2022 um 16:56 Uhr)
  Mit Zitat antworten Zitat
Andreas13

Registriert seit: 14. Okt 2006
Ort: Nürnberg
719 Beiträge
 
Delphi XE5 Professional
 
#15

AW: Inkompatible Datentypen in Procedures bei Arrays mit Double bzw. Extended

  Alt 25. Jan 2022, 17:01
Nja, wird eh Zeit, dass wir Float128 (quadruple precision) im Delphi bekommen, was uns im IEEE 754 versprochen wurde.
quadruple precision gibt's derzeit nur als externe Delphi-Bibliothek von Erik van Bilsenhttps://github.com/neslib/Neslib.MultiPrecision. Allerdings kennt die zugrundeliegende C++-Bibliothek noch kein +/- Unendlich und liefert bei manchen algebraischen Operationen anstelle von 0 (z.B. bei 1/Unendlich) noch sinnlose Fehlermeldungen. Habe bereits vor etlichen Monaten den Urheber der C++-Bibliothek auf https://www.davidhbailey.com/dhbsoftware/ um Korrektur gebeten, was auch versprochen wurde. Anscheinend ist aber das Problem komplexer als es scheint.
Gruß, Andreas
Grüße, Andreas
Wenn man seinem Nächsten einen steilen Berg hinaufhilft, kommt man selbst dem Gipfel näher. (John C. Cornelius)

Geändert von Andreas13 (25. Jan 2022 um 17:32 Uhr)
  Mit Zitat antworten Zitat
enigma

Registriert seit: 15. Jun 2008
47 Beiträge
 
#16

AW: Inkompatible Datentypen in Procedures bei Arrays mit Double bzw. Extended

  Alt 27. Jan 2022, 08:31
Vielen Dank für eure hilfreichen Tipps!
Auf overload bin ich inzwischen selbst gekommen
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:43 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz