我在DLL中有这个功能。
int triangle_in_bb_check_int(float* p_bb1, float* p_bb2, float** p_vertices)
然后我在Python中有这个代码,我填充了一些数组并尝试将它们传递给这个DLL函数(注意我不知道在第3个参数中放什么)。
bbbox1 = [0 for x in range(3)]
bbbox2 = [0 for x in range(3)]
triangle_vertex = [[0 for x in range(3)] for y in range(3)]
#... populate the data above with floats
mydll = windll.LoadLibrary("GA_Tools.dll")
mydll.restype = c_int
mydll.triangle_in_bb_check_int.argtypes = [POINTER(c_float), POINTER(c_float), ????]
mydll.triangle_in_bb_check_int(bbbox1, bbbox2, triangle_vertex)
如何正确地将多维数组 triangle_vertex 传递给DLL函数?
答案 0 :(得分:0)
您可以使用此功能转换列表:
import ctypes as ct
def float_list(lst):
if isinstance(lst[0], list):
data = [float_list(row) for row in lst]
return (ct.POINTER(ct.c_float) * len(lst))(*data)
return (ct.c_float * len(lst))(*lst)
这仅适用于传递列表。您无法从C函数内部更改其内容。
在argtypes
中,您只需添加type(triangle_vertex)
。
编辑:如何使用:
from ctypes import *
# Create and fill your lists
def float_list(lst):
if isinstance(lst[0], list):
data = [float_list(row) for row in lst]
return (POINTER(c_float) * len(lst))(*data)
return (c_float * len(lst))(*lst)
arg1 = float_list(bbbox1)
arg2 = float_list(bbbox2)
arg3 = float_list(triangle_vertex)
mydll = windll.LoadLibrary("GA_Tools.dll")
mydll.restype = c_int
mydll.triangle_in_bb_check_int.argtypes = [type(arg1), type(arg2), type(arg3)]
result = mydll.triangle_in_bb_check_int(arg1, arg2, arg3)
该函数将1d列表转换为c_float_Array
对象(在C中可以称为单个指针),将2d列表转换为LP_c_float_Array
(可以称为双指针)