1、参数为指针的解决方法:
在项目开发中遇到了,python需要去调用一个动态链接库dll中的c++方法。这个方法的参数为一个指针类型的参数,一个bool类型参数
在python中并未对数字类型进行区分。
dll库中的方法为:
int LP_Agc ( double * a,
bool b= true
)
所以在调用这个方法之前,
第一步要将python中的类型转换为c语言类型。
这个应该是python自带的
a = c_double(1.0)
#同理
b = c_double(True)
#python中还有c_int(),c_float()等。需要什么用什么。可以在 _init_.py中找到这些方法。
第二步 ,lgc中的第一个参数为 double类型的指针类型。。
在python中同样有使用指针的方法。pointer()
pcdi = pointer(c_double(1.0))
即:
dll.LP_Agc(pointer(c_double(1.0),c_bool(True)) 就可以成功调用方法。
byref(n)返回的相当于C的指针右值&n,本身没有被分配空间:所以他只能作为参数。
pointer返回的相当于指针左值T* p=&n,可以改变,可以取地址:
2、参数为数组的解决方法:
dll库中的方法为:
int input[2] = [0, 1]
void printIntArray(int[] input)
{ for(int i = 0; i < 2; i ++)
{ print(input[i]); }
}
python调用上面的方法:
from ctypes import *
# 假设上面的代码被编译成了一个XXXXlib.so的文件
dll = CDLL('XXXXlib.so')
# 声明一个数组类型
INPUT = c_int * 2
# 实例化一个长度为2的整型数组
input = INPUT()
# 为数组赋值(input这个数组是不支持迭代的)
input[0] = 1
input[1] = 2
# 引用C语言的函数
print_int_array = dll.printIntArray
# 调用C语言的函数
print_int_array(input)