0

私は現在、Fortran dll からの PDE ソルバーを必要とする simultion-tool に取り組んでいます。Python から dll を呼び出す方法を理解するために、同じ dll からより単純な関数を使用しましたが、動作させることができません。

システムスペック: Windows 7 Professional (64bit) Spyder 3.2.8 Python 3.6.5 (32bit)

現在、cffi を使用して fortran 関数を呼び出していますが、どちらも機能しません。

    import cffi as cf

    ffi=cf.FFI()

    lib=ffi.dlopen("C:\Windows\SysWOW64\DLL20DDS")

    ffi.cdef("""
             double S01BAF(double X, int IFAIL);
    """)

    print (lib)   #This works
    print (lib.S01BAF)   #This works

    x = 1.
    ifail = 0

    print (lib.S01BAF(x,ifail)) #This doesn't work

これは、cffi で関数を呼び出すために使用しているコードです。ロードしているdllには、呼び出す予定の関数S01BAFが含まれています。表示されるエラー メッセージは次のとおりです。

   runfile('C:/Users/Student/Desktop/Minimal.py', wdir='C:/Users/Student/Desktop')
   <cffi.api._make_ffi_library.<locals>.FFILibrary object at 0x0759DB30>
   <cdata 'double(*)(double, int)' 0x105BBE30>
   Kernel died, restarting

それが何を意味するのかわかりません。

関数自体が機能しているかどうかを確認するために、別の言語 (VBA) から呼び出してみましたが、問題なく機能しました。

    Option Base 1
    Option Explicit

    Private Declare Function S01BAF Lib "DLL20DDS.dll" (x As Double, iFail As Long) As Double

    Sub ln()
        Dim iFail As Long
        Dim x As Double
        Dim y As Double

        x = 1
        iFail = 0
        y = S01BAF(x, iFail)
        MsgBox y
    End Sub

メッセージボックスには、ln(2) の正しい値が表示されます。

以前に寄せられた質問を読みましたが、私の問題に回答を適用できませんでした。

@Joeのおかげで機能するコードは次のとおりです。

    ffi=cf.FFI()
    lib=ffi.dlopen("C:\Windows\SysWOW64\DLL20DDS")
    ffi.cdef("double S01BAF(double *x, int *ifail);")

    x_1 = np.arange(-0.99,1,0.001)

    x = ffi.new('double*', 1)
    ifail = ffi.new('int*', 0)    

    y = (lib.S01BAF(x,ifail))

乾杯、ティロ

4

1 に答える 1