Ctypes将float传递给函数返回随机数

时间:2018-07-04 02:24:38

标签: python c python-2.7 typeerror ctypes

为了提供一些背景知识,我使用的是Linux,并且我的C代码如下:

int c_func(const char* dir, float a, float b, float c, float d )
{
    printf("%s\n", dir);
    printf("%f\n",a);
    printf("%f\n",b);
    printf("%f\n",c);
    printf("%f\n",d);

    return 0;
}

这是一个简单的函数,它接受一个字符串并以4个浮点数作为参数,并在我尝试测试phython / C接口时将其打印出来。我的python代码如下:

calling_function = ctypes.CDLL("/home/ruven/Documents/Sonar/C interface/Interface.so")
calling_function.c_func.argtypes = [ctypes.c_char_p, ctypes.c_float, ctypes.c_float, ctypes.c_float, ctypes.c_float]
calling_function.c_func.restype =  ctypes.c_float

for _fv in _testFV:
                _predOut = calling_function.c_func("hello",_fv[0], _fv[1], _fv[2], _fv[3])
                exit(1)

为澄清起见,_fv[0], _fv[1], _fv[2], _fv[3]分别是[1.969591, 112.7779, 1.8701470000000002, 111.7575]。 _testFV是其他117个列表的列表。我只是想从_testFV中提取第一个列表。

运行此代码后,我能够正确打印字符串,但浮点数似乎是较大的随机数(1849375168、3、4805786、9397952),而不是_fv[0], _fv[1], _fv[2], _fv[3]的实际值。因此,要检查我是否将正确的值传递到calling_function.c_func函数中,我包括了一条打印语句,用于打印_fv[0], _fv[1], _fv[2], _fv[3]的值及其类型。我检查了一下,这些值是浮点型的,正确的数字正在输入到函数中,但随机数正在打印出来。我以为我可能错误地声明了retype,但是我认为当C代码返回0时,应该将restype声明为int。

问题1:为什么函数会打印出随机数而不是我输入到函数中的浮点数。

问题2:该函数应该输出1个字符串和4个浮点数,所以我应该将restype声明为1个字符串和4个浮点数吗?

我尝试过的事情:

  1. 将所有float变量更改为双精度。

  2. 将restype更改为int并加倍。

  3. 将python中的calling_function.c_func的参数更改为("hello",1,2,3,4),而python中的函数能够打印出正确的值。当我将参数更改为(“ hello”,1.2,2.3,3.4,4.3)时,它再次为我提供了随机数。我相信有些类型声明我做错了,但是我不确定是什么。

  4. 将restype行更改为calling_function.c_func.restype = [ctypes.c_char_p, ctypes.c_float, ctypes.c_float, ctypes.c_float, ctypes.c_float],但这会出现以下错误:TypeError:restype必须为类型,可调用或无。

我不太确定发生了什么。任何帮助将非常感激。谢谢!

1 个答案:

答案 0 :(得分:0)

c_float的{​​{1}}和argtypes的{​​{1}}用作我的话:

foo.c:

c_int

使用Python 2.7:

restype