关于python调用C++所形成的dll文件中的以指针为返回值的函数

关于python调用C++所形成的dll文件中的以指针为返回值的函数

#写在前面
作为一个编程小白,最近在做毕业设计需要用到前人写好的C++程序,而且这个C++程序里的函数是以数组指针作为返回值,而我用的是python,一时之间竟然不知道该怎么办。
在找寻了一些资料后找到了下面的解决方法。
#正文
假设原来的C++函数API接口提示如下:

float* function(float array[3])

这个API需要传入一个float型的数组,并返回一个指针。
在python进行了ctypes.cdll.loadliborary()载入dll操作后,可以在python中建立一个数组(?老实讲,我还是不太能理解python“一切均是(残缺的)指针”的说法)

class array(Structure):
		_fields_ = [('a',c_float),
		            ('b',c_float),
		            ('c',c_float)]
A = array(0,1,2)
#死记硬背,直接理解为了python中建立数组的一个方法
#仅仅建立数组后,还需要对调用的函数的输入与输出格式进行调整
#调整的方法是调用一个函数
def fillprototype(f,restype,argtypes):
    f.restype = restype
    f.argtypes = argtypes
   
test=ctypes.cdll.LoadLibrary("./xxxxx.dll")#导入dll文件 
fillprototype(test.function,ctypes.POINTER(ctypes.c_float)[ctypes.POINTER(array)])

test_address_value =  test.function(A)

for i in range(3):
	print(test_address_value[i])
	i += 1

python的ctypes文档中说argtypes现在已经不需要追寻ctypes中的固定形式,但是如果直接写成:

fillprototype(test.function,ctypes.POINTER(ctypes.c_float)[ctypes.POINTER(c_float*3())])

这样的话会报出_from_pragma_的错误。因此这也是必须在开头进行

class array(Structure)

这一定义的原因。

你可能感兴趣的:(python,dll,python,c++)