亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用 Char 作為參數從 Fortran DLL 調用函數

使用 Char 作為參數從 Fortran DLL 調用函數

蠱毒傳說 2023-12-12 21:21:45
我正在嘗試使用 Python 從第 3 方 Fortran DLL 調用函數(冒泡排序)。我的問題是將一個字符傳遞給函數。我讓它與 cffi 一起工作,如下所示,但我想使用 ctypes。cffi版本:import numpy as npimport cffi as cfffi=cf.FFI()lib=ffi.dlopen(r"C:\Windows\SysWOW64\DLL20DDS")ffi.cdef("""void M01CAF( double rv[], const int *m1, const int *m2,         const wchar_t *order, int *ifail);""")m1 = 1m1 = ffi.new("int*", m1)m2 = 16m2 = ffi.new("int*", m2)order = ffi.new('wchar_t *', "A")rvx = np.array([1.3, 5.9, 4.1, 2.3, 0.5, 5.8, 1.3, 6.5,                 2.3, 0.5, 6.5, 9.9, 2.1, 1.1, 1.2, 8.6], dtype=float, order='F')rv = ffi.cast("double* ", rvx.__array_interface__['data'][0])ifail = 0ifail = ffi.new('int*', ifail)lib.M01CAF(rv, m1, m2, order, ifail)print(rvx)輸出:[0.5 0.5 1.1 1.2 1.3 1.3 2.1 2.3 2.3 4.1 5.8 5.9 6.5 6.5 8.6 9.9]現在我的 ctypes 版本:import numpy as npimport ctypes as ctflib = ct.WinDLL('C:\Windows\SysWOW64\DLL20DDS.dll')func = getattr(flib, "M01CAF")func.restype = Nonem1 = (ct.c_int32)(1)m2 = (ct.c_int32)(16)ifail = ct.c_int32(0)rv = np.array([1.3, 5.9, 4.1, 2.3, 0.5, 5.8, 1.3, 6.5,                 2.3, 0.5, 6.5, 9.9, 2.1, 1.1, 1.2, 8.6], dtype=ct.c_double, order='F')order = 'A'order = ct.c_wchar_p(order)func.argtypes = (np.ctypeslib.ndpointer(dtype=ct.c_double, shape=(m2.value,)),                 ct.POINTER(ct.c_int32), ct.POINTER(ct.c_int32),                 ct.c_wchar_p, ct.POINTER(ct.c_int32))func(rv, m1, m2, order, ifail)錯誤信息:OSError: exception: access violation writing 0xFFFFFFFC______________________________________________________cffi 遇到的一個問題是:當我再次調用該函數時,它不會對數組進行排序。我需要重新啟動內核才能獲得正確的結果:rvx = np.array([1.3, 5.9, 4.1, 2.3, 0.5, 5.8, 1.3, 6.5,                 2.3, 0.5, 6.5, 9.9, 2.1, 1.1, 1.2, 8.6], dtype=float, order='F')rv = ffi.cast("double* ", rvx.__array_interface__['data'][0])lib.M01CAF(rv, m1, m2, order, ifail)print(rvx)輸出:[1.3 5.9 4.1 2.3 0.5 5.8 1.3 6.5 2.3 0.5 6.5 9.9 2.1 1.1 1.2 8.6]______________________________________________________現在我在 Win10 64 位上使用 Spyder 和 Python 3.8.3 32 位。
查看完整描述

1 回答

?
HUWWW

TA貢獻1874條經驗 獲得超12個贊

通過將 char 的長度作為常規整數(而不是指針)傳遞到 char 本身的指針之后,解決了所有問題。CFFI 也是如此。


## CTYPES

import ctypes as ct

flib = ct.WinDLL('C:\Windows\SysWOW64\DLL20DDS.dll')

func = getattr(flib, "M01CAF")

func.restype = None


m1 = (ct.c_int32)(1)

m2 = (ct.c_int32)(16)

ifail = ct.c_int32(0)

rv = np.array([1.3, 5.9, 4.1, 2.3, 0.5, 5.8, 1.3, 6.5, 

                2.3, 0.5, 6.5, 9.9, 2.1, 1.1, 1.2, 8.6], dtype=ct.c_double, order='F')


order = ct.c_wchar_p('A')

func.argtypes = (np.ctypeslib.ndpointer(dtype=ct.c_double, shape=(m2.value,)), 

                ct.POINTER(ct.c_int32), ct.POINTER(ct.c_int32), 

                ct.c_wchar_p, ct.c_int32, ct.POINTER(ct.c_int32))


print("BEFORE:")

print(rv)


func(rv, m1, m2, order, 1, ifail)


print("AFTER:")

print(rv)


查看完整回答
反對 回復 2023-12-12
  • 1 回答
  • 0 關注
  • 167 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號