2016-04-19 50 views
4

我正在练习从python(2.7)进行C函数调用。如何使一个Python C函数调用乘以2个浮点数?

我已经成功这是对https://docs.python.org/2/extending/extending.html

现在我正在适应这个例子乘2个漂浮并返回结果中列出的例子。我在我的c源文件中实现了以下功能。然而

Traceback (most recent call last): File "main.py", line 12, in print(demo.multiply((2.0, 4.0))) TypeError: a float is required

很明显,我在执行一些错误,:

static PyObject *demo_multiply(PyObject *self, PyObject *args) 
{ 
    const float *command; 
    float x; 

    if (!PyArg_ParseTuple(args, "f", &command)) return NULL; 
    x = command[0] * command[1]; 
    return Py_BuildValue("f", x); 
} 

我打电话在python此功能如下:

print(demo.multiply((2.0, 4.0)) 

导致下面的输出我不知道它是什么,因为相信 我已经很清楚地遵循docs.python.org上的文档。请问有人可以指出我在这里失踪了什么 ?

+4

'F'意味着* *一个浮动,而不是他们的元组。 – user2357112

+0

好的。所以我尝试了以下调整:(在C源代码中)'if(!PyArg_ParseTuple(args,“ff”,&command))return NULL;'(in py source)'print(demo.multiply(2.0,4.0)'这似乎更糟,因为现在我得到了一个分段错误 – Gio

+0

好的,我已经解决了!我还需要调整(C source)'float command [2]' – Gio

回答

3

感谢用户user2357112评论,我已经解决了这个问题。我在这里发布了代码,以供遇到类似问题的人使用。

(C)

static PyObject *demo_multiply(PyObject *self, PyObject *args) 
{ 
    float y[2]; 
    float x; 

    if (!PyArg_ParseTuple(args, "ff", &(y[0]), &(y[1]))) return NULL; 
    x = y[0] * y[1]; 
    return Py_BuildValue("f", x); 
} 

(Python)的

print(demo.multiply(2.0, 4.0))