我有一个C++函数,我想在Python 2.7.12中调用它,函数如下所示:
基本上,这个函数以两个整数a和b作为输入(加上我省略了一些数据的其他部分),在将结果放入两个数组y、z及其各自的大小n_y、n_z中进行一些计算,并返回一个大小为a*b的数组x。
在将此函数构建为共享库myfunction.so之后,我在Python中调用它的方式如下:
运行这个脚本时,我遇到了一个错误:
ctypes.ArgumentError: argument 3: : 错误的类型
所以,
非常感谢您的帮助!
更新
根据@GiacomoAlzetta和@CristiFati的建议,我已经更改了我的代码,使用指针代替引用传递,如下所示。
(
现在在C++中,我按照以下方式调用上述函数:
感谢您的帮助!
extern "C" {
double* myfunction(double* &y, double* &z, int &n_y, int &n_z, int a, int b)
{
vector<double> _x;
vector<double> _y;
vector<double> _z;
// Call some external C++ function
cpp_function(_x, _y, _z, a, b);
// Convert vectors back to arrays
double* x = &_x[0]; // or x = _x.data();
y = &_y[0];
z = &_z[0];
n_y = static_cast<int>(_y.size());
n_z = static_cast<int>(_z.size());
return x;
}
}
基本上,这个函数以两个整数a和b作为输入(加上我省略了一些数据的其他部分),在将结果放入两个数组y、z及其各自的大小n_y、n_z中进行一些计算,并返回一个大小为a*b的数组x。
在将此函数构建为共享库myfunction.so之后,我在Python中调用它的方式如下:
from ctypes import *
libc = CDLL('myfunction.so')
myfunction = libc.myfunction
myfunction.restype = POINTER(c_double)
myfunction.argtypes = [POINTER(c_double), POINTER(c_double),
c_int, c_int,
c_int, c_int]
y = POINTER(c_double)()
z = POINTER(c_double)()
n_y = c_int()
n_z = c_int()
a = 18
b = 18
x = myfunction(byref(y), byref(z),
byref(n_y), byref(n_z),
c_int(a), c_int(b))
运行这个脚本时,我遇到了一个错误:
ctypes.ArgumentError: argument 3: : 错误的类型
所以,
n_y
的类型是不正确的。我应该放什么呢?非常感谢您的帮助!
更新
根据@GiacomoAlzetta和@CristiFati的建议,我已经更改了我的代码,使用指针代替引用传递,如下所示。
(
y
和z
类似,所以让我省略z
)extern "C" {
double* myfunction(double** y, int* n_y, int a, int b)
{
vector<double> _x;
vector<double> _y;
// Call some external C++ function
cpp_function(_x, _y, a, b);
// Convert vectors back to arrays
double* x = &_x[0]; // or x = _x.data();
*y = &_y[0];
*n_y = static_cast<int>(_y.size());
return x;
}
}
现在在C++中,我按照以下方式调用上述函数:
double* y;
int n_y;
int a = 18;
int b = 18;
double* x = myfunction(&y, &n_y, a, b);
这是有效的。在Python中:
from ctypes import *
libc = CDLL('myfunction.so')
myfunction = libc.myfunction
myfunction.restype = POINTER(c_double)
myfunction.argtypes = [POINTER(POINTER(c_double)), POINTER(c_int),
c_int, c_int]
y = POINTER(POINTER(c_double))()
n_y = POINTER(c_int)()
a = 18
b = 18
x = myfunction(y, n_y, c_int(a), c_int(b))
出现了分段错误
,该错误发生在该行:
*y = &_y[0];
感谢您的帮助!
int
的指针吗? - Giacomo Alzetta