2017-03-09 2 views
0

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?

+0

Obwohl es hier keine Rolle, 'Rückkehr i 'in der Fortran-Subroutine bedeutet wahrscheinlich nicht, was Sie denken, dass es bedeutet. – francescalus

+0

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

+0

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? –

Antwort

0

UPDATE:

Ich habe mein Problem gelöst.

from ctypes import * 

DLL = windll.fort_test 
print DLL 

x = byref(c_int(3)) 
print x res = DLL.ex_(x) 
print cast(res,POINTER(c_int)).contents 

Ich habe dies auch viel aufgeräumt. Ich übergeben durch Verweis noch, dann die Speicheradresse, die als c_int Zeiger zurückgegeben wird (alle Caps ist wichtig) und dereference es mit der '.contents' Funktion Zeiger haben

+0

Suchen Sie nach 'argtypes' und' restype', um das Anrufen zu erleichtern. –

Verwandte Themen