正如标题所说:我很想在C ++中建立一个python绑定,该绑定在某些数组上执行代数运算。为此,我必须将python“数组对象”解析为C的double或integer或任何情况的向量。我尝试这样做,但是遇到一些问题。我创建了一个新的python类型和一个名称为Typer
的类,在该类中,我有此方法尝试获取python数组的元素,然后计算总和(作为第一步)。
tatic PyObject *Typer_vectorsum(Typer *self, PyObject *args)
{
PyObject *retval;
PyObject *list;
if (!PyArg_ParseTuple(args, "O", &list))
return NULL;
double *arr;
arr = (double *)malloc(sizeof(double) * PyTuple_Size(list));
int length;
length = PyTuple_Size(list);
PyObject *item = NULL;
for (int i = 0; i < length; ++i)
{
item = PyTuple_GetItem(list, i);
if (!PyFloat_Check(item))
{
exit(1);
}
arr[i] = PyFloat_AsDouble(item);
}
double result = 0.0;
for (int i = 0; i < length; ++i)
{
result += arr[i];
}
retval = PyFloat_FromDouble(result);
free(arr);
return retval;
}
在此方法中,我将python数组对象解析为C数组(使用malloc分配数组的内存)。然后,将对象中的每个元素添加到我的C数组中,然后在最后一个for循环中计算总和。
如果我先构建项目,然后创建一个python测试文件,则什么也没有发生(文件编译没有任何问题,但它没有打印任何内容。
y = example.Typer() . #typer is the init
tuple = (1, 2, 3)
print(y.vectorsum(tuple))
我想念什么吗?而且,是否有一种很好的,简便的方法将python数组对象放入C ++中,但作为std :: vector而不是经典的C数组?
谢谢您!
正如标题所说:我很想在C ++中建立一个python绑定,该绑定在某些数组上执行代数运算。为此,我必须将python“数组对象”解析为C的double或...向量。]]
元组包含整数,而不是浮点数,因此您的PyFloat_Check
失败。不,从Python元组到C数组或C ++ std::vector
没有直接方法。原因是该元组是Python对象数组,而不是C值数组,例如double
s。
这是您的示例,具有改进的错误检查,此后它应该可以工作: