ich meinen Code aus diesem questionFortran DLL in Python-Wrapper, Ausgabe für gleiche Funktion variiert
Mein Endziel ist angepasst haben: - einige Fortran-Code in einer DLL (bereits abgeschlossen) einpacken - erstellen Python-Wrapper als Schnittstelle zum Empfangen von Eingaben von einer Quelle und Bereitstellen dieser Eingaben in einer DLL und Weiterleiten an die DLLs Fortran-Funktion - gibt die Ausgabe der Funktion zur Weitergabe an ein anderes Python-Programm zurück.
Bis jetzt habe ich dieses Beispiel als Prototyp verwendet (für was ich schließlich anpassen werde), ein immer unterschiedliche Ausgänge zu bekommen.
wie hier gezeigt:
C:\Users\NAME\Desktop>python.exe py_wrapper.py
<CDLL 'fort_test', handle 6f800000 at 0x25e174ec2e8>
<_FuncPtr object at 0x0000025E17617388>
<_FuncPtr object at 0x0000025E17617388>
c_long(3)
390943376 <---int value (my annotation for clarity)
<class 'int'>
c_long(390943376)
<__main__.LP_c_long object at 0x0000025E174D54C8>
und
C:\Users\NAME\Desktop>python.exe py_wrapper.py
<CDLL 'fort_test', handle 6f800000 at 0x23fa636c2e8>
<_FuncPtr object at 0x0000023FA6497388>
<_FuncPtr object at 0x0000023FA6497388>
c_long(3)
-1506454896 <---int value (my annotation for clarity)
<class 'int'>
c_long(-1506454896)
<__main__.LP_c_long object at 0x0000023FA63554C8>
Hier ist der Inhalt meines Fortran-Code:
subroutine ex(i)
integer i
i=i+1
return i
end
und hier ist mein Python-Wrapper: (es gibt eine Menge von Testmaterial hier)
from ctypes import *
DLL = CDLL('fort_test')
print(DLL)
print(getattr(DLL, 'ex_'))
print(DLL.ex_)
x = pointer(c_int(3))
print(x.contents)
res = DLL.ex_(x)
print(res)
print(type(res))
proc_res = pointer(c_int(res))
print(proc_res.contents)
print(proc_res)
Meine Frage ist, weiß jemand, warum diese Ausgabe ändert sich ständig? Meine Eingabe war 3 in dem Code, ich würde eine Ausgabe von vier angesichts der Funktion erwarten, aber ich bekomme, was wie Speicheradressen aussieht (siehe meine Anmerkungen in den Ausgabebeispielen) oder eine vorzeichenbehaftete ganzzahlige Darstellung einer Speicheradresse?
Obwohl es hier keine Rolle, 'Rückkehr i 'in der Fortran-Subroutine bedeutet wahrscheinlich nicht, was Sie denken, dass es bedeutet. – francescalus
Oh, ich habe vergessen, das rauszunehmen, hah. Ich habe mit Sachen herumgespielt, ich weiß nicht wirklich, obran so gut haha (also warum ich versuche, es zu wickeln, der Code, den ich wirklich tun möchte, ist viel größer, und ich kann es hier nicht posten) – Andy
I Ich bin mit der Fortan-Aufrufkonvention nicht vertraut, aber Sie * übergeben * einen Zeiger auf eine Ganzzahl und nicht die tatsächliche Ganzzahl. Meine Vermutung ist, dass Sie die Adresse und nicht den Wert erhalten. Hast du eine einfache 'res = DLL.ex_ (3)' ausprobiert? –