Hallo Delphifreunde!
Derzeit bin ich dabei, eine weitere Langzahlenbibliothek (uBigIntsV3 aus der DFFLibV14) in meinen
Langzahlentaschnerechner zu integrieren.
Die Rechenfunktionen werden dort als Klassenprozeduren bereitgestellt, z.B.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| type TDigits = array of int64;
TInteger = class(TObject) protected Sign: integer; fDigits: TDigits; Base: integer; . . . public procedure Add(const I2: TInteger); overload; |
.
Zur flexiblen Handhabung - und auch zur Verschachtelung bei komplexeren Berechnungen - benötige ich jedoch Funktionen. Ein richtiges Ergebnis erhalte ich z.B. mit
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| function TI_Add(const i1,i2:TInteger):TInteger; begin result:=i1; result.add(i2) end; |
, aufgerufen z.B. so:
Delphi-Quelltext
1:
| Num3:=TI_add(Num1,Num2) |
Das Fatale: Sogar, wenn man beide Argumente in der Zielfunktion TI_Add als konstant deklariert sind, wird das erste Argument (Num1) im Ergebnis dieses Funktionsaufrufes verändert, also auch aus der Positionen derjenigen übergeordneten Funktion, aus der diese Kapselfunktion aufgerufen wird! Das ist zum Mäusemelken! Ich finde dafür keine Erklärung, weil der dortige Datentyp TInteger keine "verzeigerte" Datenstruktur ist. Ein Pointer mag ja konstant bleiben, aber der Inhalt der Adresse, auf die er hinzeigt, nicht, und schon verändern sich Inhalte, die darauf zeigen, doch diesen Fall kann ich hier nicht erkennen.
Bisherige funktionierende Abhilfe: Ich übergebe statt der Langzahl des Typs "TInteger" einen String und konvertiere diesen erst in die Kapselfunktion:
Delphi-Quelltext
1: 2: 3: 4: 5:
| function TI_Add(i1:string;i2:TInteger):TInteger; begin result:=ConvertStringToTI(i1); result.add((i2)) end; |
, doch das ist unelegant und ganz sicher gerade bei größeren/längeren Zahlen auch erheblich geschwindigkeitsmindernd.
Bei MPA von
gammatester bekam ich das gleiche Problem gelöst, hier jedoch bisher nicht.
Kennt jemand den Grund, warum die Argumente in der übergeordneten Ebene nicht konstant bleiben und ggf. einen eleganteren Weg, die aufrufenden Argumente unbehelligt zu lassen?
Danke im voraus!
Moderiert von
Narses: Topic aus Sonstiges (Delphi) verschoben am Di 23.10.2012 um 18:21