我正在使用C ++中的示例代碼來處理封閉源共享庫,如下所示:// Header#define MAX_PARAM_NAME 10int foo(..., char **ParNameList, ...);// Mainchar *ParNameList = (char *)NULL;ret = foo(..., &ParNameList,...);par = (char (*)[MAX_PARAM_NAME])ParNameList;應該如何在ctypes中處理它?有問題的部分是在函數聲明中應該使用foo(..., char **ParNameList, ...);a char **,但char *實際上是在函數調用中給出了對它的引用。到目前為止,我有:from ctypes import *so = cdll.LoadLibrary(...) so.foo.argtypes = [ ...POINTER(POINTER(c_char)), # ParNameList ...] so.foo.restype = c_int #...ParNameList = POINTER(c_char)()so.foo(..., ParNameList ,...)這給了我一個垃圾字符串,我在其中看到所需的輸出與隨機變化的RAM位交錯。但是(char (*)[MAX_PARAM_NAME])強制轉換在ctypes中如何工作?如果整個事情有更直接的方法,我將不勝感激。
2 回答

暮色呼如
TA貢獻1853條經驗 獲得超9個贊
您需要使用傳遞c_char指針的地址byref:
foo.argtypes = [..., POINTER(POINTER(c_char)), ...]
foo.restype = c_int
par_name_list = POINTER(c_char)()
# pass by reference
foo(byref(par_name_list))
par = cast(par_name_list, POINTER(c_char * MAX_PARAM_NAME))
之后,您可能需要釋放內存。
添加回答
舉報
0/150
提交
取消