为了提供一些背景知识,我使用的是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个浮点数吗?
我尝试过的事情:
将所有float变量更改为双精度。
将restype更改为int并加倍。
将python中的calling_function.c_func
的参数更改为("hello",1,2,3,4)
,而python中的函数能够打印出正确的值。当我将参数更改为(“ hello”,1.2,2.3,3.4,4.3)时,它再次为我提供了随机数。我相信有些类型声明我做错了,但是我不确定是什么。
将restype行更改为calling_function.c_func.restype = [ctypes.c_char_p, ctypes.c_float, ctypes.c_float, ctypes.c_float, ctypes.c_float]
,但这会出现以下错误:TypeError:restype必须为类型,可调用或无。
我不太确定发生了什么。任何帮助将非常感激。谢谢!
答案 0 :(得分:0)
将c_float
的{{1}}和argtypes
的{{1}}用作我的话:
foo.c:
c_int
使用Python 2.7:
restype