gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 14:31:12 25 4
gpt4 key购买 nike

我正在研究连接触觉机器人和眼动仪。因此,两者都有自己的编程要求,即眼动仪软件基于 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;}
}

这段代码的理论只是有 3 个可用的 C(不是 C++)调用,它们将与 python/ctypes 兼容:

  1. myHap_new() 返回一个指向类实例的指针
  2. myHapInit 初始化触觉设备
  3. myHapCoord 返回 int Index 引用的轴的当前位置的 double 值。

Python 类如下:

import sreb
from ctypes import cdll
lib = cdll.LoadLibrary('C:\Documents and Settings\EyeLink\My Documents\Visual Studio 2010\Projects\myHapDLLSolution\Debug\myHapDLL.dll')

class CustomClassTemplate(sreb.EBObject):
def __init__(self):
sreb.EBObject.__init__(self)
self.pyMyHapObj = pyMyHap()
self.coordval=2.0

def setCoordval(self,c):
self.coordval = c
pass

def getCoordval(self):
return self.coordval

def initOmni(self):
self.pyMyHapObj.pyHapInit()
pass

def getCoord(self):
self.coordval = self.pyMyHapObj.pyHapCoord()
return self.coordval

class pyMyHap(object):
def __init__(self):
self.obj = lib.myHap_new()
self.coord = 1.0

def pyHapInit(self):
lib.myHapInit(self.obj)

def pyHapCoord(self):
self.coord = lib.myHapCoord(self.obj)
return self.coord

python自定义类的原理是实例化一个加载的DLL类的对象(self.pyMyHapObj = pyMyHap())。调用函数“initOmni”成功初始化机器人,但调用“getCoord”不会返回预期值。事实上,我从“getCoord”得到的结果是 1(它被列为 1,而不是 1.0,所以我认为它返回的是一个整数,而不是它应该返回的 double )。

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

那么我的 python 类是什么导致 ctypes 没有从我的 DLL 的 myHapCoord 返回正确的值?

如有任何帮助,我们将不胜感激。谢谢

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

最佳答案

返回值默认为 int。使用类似的东西:

lib.myHapCoord.restype = ctypes.c_double

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

关于python和ctypes cdll,没有从函数中获得预期的返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10544630/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com