Entwickler-Ecke

Algorithmen, Optimierung und Assembler - Fehler in MP_Real.mpf_tohex_n(..) von Gammatester


Andreas_500 - Mo 26.04.21 13:37
Titel: Fehler in MP_Real.mpf_tohex_n(..) von Gammatester
Hallo Community,
arbeitet jemand von Euch mit der Routine MP_Real.mpf_tohex_n(...) von user profile iconGammatester?

Es ist etwas fehlerhaft dabei, weil bei der Konvertierung einer mp_float-Zahl in einen Hexadezimal-String unerklärliche Access Violations in der Zeile

Delphi-Quelltext
1:
pstr^ := #0;                    

innerhalb der Procedure s_mpf_toradix_n(..) auftreten.

Kennt jemand vielleicht eine Abhilfe?
Danke im Voraus!

Gruß, Andreas

Moderiert von user profile iconTh69: Titel geändert (Realen Namen entfernt).
Moderiert von user profile iconTh69: User-Link hinzugefügt
Moderiert von user profile iconTh69: B- durch Delphi-Tags ersetzt


Th69 - Mo 26.04.21 15:22

Hallo und :welcome:

hast du schon eine PN an user profile iconGammatester geschickt?
Oder hast du einen Link auf den Source-Code?


Gausi - Mo 26.04.21 15:55

Das mit der PN dürfte leider sehr schwierig werden. Er ist leider vor knapp 2 Jahren verstorben. :(

Siehe auch https://www.delphipraxis.net/200202-rip-gammatester.html


Th69 - Mo 26.04.21 16:19

Ups, ja ich hatte damals den Thread gelesen, aber wieder vergessen. :cry:


Andreas_500 - Mo 26.04.21 17:32

Hallo,
hier ist der letzte Stand seines Quellcodes: https://github.com/moe123/www.wolfgang-ehrhardt.de
Gruß, Andreas


Th69 - Mo 26.04.21 17:51

Ich sehe jetzt nicht auf Anhieb, in welchem ZIP-Package die Funktion ist.
Könntest du daher den (relevanten) Code der Funktionen mpf_tohex_n(...) sowie s_mpf_toradix_n(...) hier posten?
Und mit welchem Wert rufst du diese Funktion auf? Oder kommt die Access Violation bei jedem Wert?


Andreas_500 - Mo 26.04.21 20:04

Hallo,
ich habe für die Demonstration der Benutzung der fehlerhaften Routine

Delphi-Quelltext
1:
MP_Real.mpf_tohex_n(…)                    

ein kleines Konsolen-Testprogramm MPF_ToHex_n_1.dpr erstellt (Delphi XE5 Pro). Hier befindet sich zur Kontrolle auch eine eigene Funktion Dezimal_To_Hex(…), die Multipräzisions-Fließkommazahlen beliebiger Stellenzahl korrekt in einen Hexadezimal-String umrechnet. Im Programm ist die Stelle markiert, wo ein „Access violation“ auftritt.

Wegen des komplexen Zusammenspiels zahlreicher Units und *.inc habe ich auch noch 11 weitere benötigte Original-Files von Gammatester beigefügt. Sollten evtl. weitere Files fehlen, diese sind zu finden unter:

https://github.com/moe123/www.wolfgang-ehrhardt.de

Obwohl meine Function Dezimal_To_Hex(…) die Routine MP_Real.mpf_tohex_n(…) ersetzt, wäre ich an der Lösung des Problems trotzdem sehr interessiert, da die fehlerverursachende innere Procedure s_mpf_toradix_n(..) in Gammatester's Bibliotheken an zahlreichen weiteren Stellen intern verwendet wird.

Danke für Eure Hilfe und kritischen Bemerkungen!

Gruß, Andreas
PS: Zielplattform: Win 32 Bit

Anhang: MPF_ToHex_n - 1.zip

Moderiert von user profile iconTh69: Delphi-Tags hinzugefügt


jaenicke - Mo 26.04.21 21:13

Da du PSt nicht initialisierst, aber angibst, dass an diese Speicherstelle (nil!!) 200 Zeichen hinein passen, kann das nicht gehen...

// EDIT:
So geht es z.B.:

Delphi-Quelltext
1:
2:
3:
4:
      SetLength(ASt, 200);
      MP_Real.mpf_tohex_n(Wert_Global, 100, PAnsiChar(ASt), 200);
          
      WriteLn('MP_Real.mpf_tohex_n(Wert_Global, 100, PSt, 200); = ', ASt);


Andreas_500 - Mo 26.04.21 21:54

@jaenicke
Vielen Dank Sebastian!
Bin wohl blind für die eigenen Fehler... :oops: :autsch:
Gruß, Andreas