Hallo Himitsu,
danke für Deine Anregungen und Hilfe. Ich möchte mein Problem etwas verdeutlichen: In Jahrzehnte-langer Arbeit habe ich eine große Menge an mathematischen Funktionen und Prozeduren zur Lösung verschiedenster Probleme erstellt. Meine Bibliothek liegt in
proceduraler Form vor, also ohne Klassen und Objekte. Die unterschiedlichen Aufgaben (hier vereinfacht durch „MyFunktion“) übergebe ich an die Routinen mittels ProzedurPointer, daher haben all die Routinen zum Empfangen der konkretisierten Aufgabe entsprechende Pointer. Zuerst hatte ich einfache
ProzedurPointer / FunktionsPointer verwendet.
Da ich in den konkreten Anwendungen jedoch auch eigene Klassen und Objekte benutze, habe ich vor gut 15 Jahren alle ProzedurPointer in
MethodenPointer geändert. Dann konnte allerdings ich die Bibliotheks-Routinen von einfachen Prozeduren/Funktionen nicht mehr aufrufen.
Zum Glück fand ich in
https://www.delphi-treff.de/object-p...ethodenzeiger/ die Möglichkeit, „eine gewöhnliche Prozedur als Methode zu missbrauchen“. Und das hat bisher auch hervorragend funktioniert. Und damit kann ich
mit MethodenPointern sowohl Methoden, wie auch externe Funktionen aufrufen.
Seit kurzem versuche ich einige meiner bisherigen Berechnungen(Genauigkeit = Extended bzw. Multipräzisions-Arithmetik) auf den DatenType
DoubleDouble bzw.
QuadDouble der
Neslib.MultiPrecision-Bibliothek:
https://github.com/neslib/Neslib.MultiPrecision umzustellen.
DoubleDouble entspricht formal obigem Record.
Und hierbei tritt das neue Problem auf, dass der Record DoubleDouble – im Gegensatz zum einfachen Extended oder Double – nicht mehr als Argument an
in FunktionsPointer gecastete MethodenPointer übergeben wird. Es wird zwar die richtige Funktion aufgerufen, aber der Inhalt des Records ist zufällig, als hätte der Compiler eine neue Variable auf dem Stack abgelegt und „vergessen“, den Inhalt des Parameter-Records reinzukopieren. Auch eine Änderung des Parameters von CONST in VAR, oder ohne beides, bringt nichts.
Du hast recht, das frühere Ergebnis war nicht korrekt, obwohl ich die Löschroutine ClearRec(..) genau aus diesem Grund eingebaut hatte, um nicht korrekte Ergebnisse der Vorrunde ungewollt zu verschleppen und als korrekt zu übernehmen.
Nach Beheben einiger Fehlern von mir & Hinzufügen eines Pointers in der Klasse habe ich eine erweiterte Demo mit 4 Möglichkeiten gemacht, wobei ich die ersten beiden funktionierenden Fälle auskommentiert habe.
Leider wird
immer noch ein Record mit Zufallsinhalt an die aufgerufene Funktion übergeben.
Was mache ich falsch? Und vor allem, wie wäre es richtig?
Dank & Gruß, Andreas