python和ctypes cdll,无法从函数中获得预期的返回

python和ctypes cdll,无法从函数中获得预期的返回,python,ctypes,robotics,Python,Ctypes,Robotics,我正在研究触觉机器人和眼动跟踪器的接口。因此,两者都有自己的编程需求,即eye tracker软件基于python,是我编程的主要语言。我们的触觉机器人有一个C语言的API,所以我不得不用C语言编写一个包装器,将其编译为DLL,并用python中的ctypes加载函数 我用MATLAB测试了我的DLL,一切正常。然而,当我查询机器人的位置坐标时,python类中ctypes的实现并没有给我预期的返回值 我将在这里发布代码,并在底部对问题进行更清晰的解释 DLL包装器的C源代码: #include

我正在研究触觉机器人和眼动跟踪器的接口。因此,两者都有自己的编程需求,即eye tracker软件基于python,是我编程的主要语言。我们的触觉机器人有一个C语言的API,所以我不得不用C语言编写一个包装器,将其编译为DLL,并用python中的ctypes加载函数

我用MATLAB测试了我的DLL,一切正常。然而,当我查询机器人的位置坐标时,python类中ctypes的实现并没有给我预期的返回值

我将在这里发布代码,并在底部对问题进行更清晰的解释

DLL包装器的C源代码:

#include <QHHeadersGLUT.h>
using namespace std;
class myHapClass{
public:
void InitOmni()
{
    DeviceSpace* Omni = new DeviceSpace; //Find a the default phantom
}
double GetCoord(int index)
{
    HDdouble hapPos[3];
    hdGetDoublev(HD_CURRENT_POSITION,hapPos);
    return hapPos[index];
}
};

extern "C" {
int index = 1;
__declspec(dllexport) myHapClass* myHap_new(){ return new myHapClass();}
__declspec(dllexport) void myHapInit(myHapClass* myHapObj){ myHapObj->InitOmni();}
__declspec(dllexport) double myHapCoord(myHapClass* myHapObj){ double nowCoord = myHapObj->GetCoord(index); return nowCoord;}
}
python自定义类的理论是实例化加载的DLL类的对象(self.pyMyHapObj=pyMyHap())。调用函数“initOmni”成功初始化robot,但是调用“getCoord”不会返回预期值。事实上,我从“getCoord”得到的结果是1(它被列为1,而不是1.0,所以我认为它返回的是一个整数,而不是应该返回的双精度)

在MATLAB中,我使用了DLL库,myHapInit和myHapCoord函数都可以工作,我可以成功地初始化机器人并查询位置坐标

那么,是什么原因导致ctypes没有从我的DLL中从myHapCoord返回正确的值呢

任何帮助都将不胜感激。 谢谢


编辑:Python版本2.3,如果重要的话。。。我坚持那个版本。

返回值默认为
int
。使用类似于:

lib.myHapCoord.restype = ctypes.c_double

在调用函数正确解释返回值之前。

hmmm。这是有意义的,因为matlab需要DLL的头文件,从中获取参数类型。python/ctypes中没有要求标题,因此这是有意义的。我希望将输出流式传输到声明为double的变量会自动将其转换为正确的类型,但我对python了解不多,所以我想不会。。明天我在实验室的第一件事就是试试。谢谢!不客气!有关详细信息,请参阅。如果答案对你有用,记得接受:^)很好,谢谢。我浏览了一些ctypes教程,但内容非常广泛,我错过了这个。另一个有用的相关信息是finding.argtypes=。。。用于定义输入参数类型。此外,我还必须包括“从ctypes导入c_double”之类的内容。再次感谢!
lib.myHapCoord.restype = ctypes.c_double