我正在使用ctypes从python调用C DLL。对于大多数功能,所有功能都可以正常工作。但是...现在我有一个需要输入十六进制常量的函数,而且我似乎无法正确传递它。我没有C源代码,但是从文档中可以看到,函数定义如下:sensv_bn* NewSensvToFinding_bn (const node_bn* Qnode, const nodelist_bn* Vnodes, int what_find)我几乎可以肯定我正在传递Qnode并且Vnodes正确,因为它们是由DLL中的其他函数创建的。问题是与int所谓的what_find。从DLL附带的头文件中,我看到以下行: enum {ENTROPY_SENSV = 0x02, REAL_SENSV = 0x04, VARIANCE_SENSV = 0x100, VARIANCE_OF_REAL_SENSV = 0x104}; /* for NewSensvToFinding_bn */我要传递what_find的值VARIANCE_OF_REAL_SENSV是十六进制值0x104。我试着不经过转换就传递了它,也使用ctypes.c_int(0x104)了它,将其强制转换为int,但是函数返回的是0而不是指针。我也尝试过不经过转换而得到相同的结果。我应该执行更适当的转换吗?我有点C n00b,如果这是一个非常幼稚的问题,抱歉。
2 回答
芜湖不芜
TA贡献1796条经验 获得超7个赞
Python和C都允许您使用十六进制文字定义整数。它们被解释为以16为底,但是它们的值仍然是整数。对于相同的值,它不过是一种替代的表示法:
>>> 0x02
2
>>> 0x104
260
>>> import ctypes
>>> ctypes.c_int(0x104)
c_int(260)
您还可以使用八进制(0o404,或者仅在python 2中使用0404)或二进制(0b100000100)表示法来指定相同的整数值。
签名指定它需要一个int,因此传入一个整数值。如果需要,可以在Python源代码中将该整数值指定为十六进制文字,但是C代码只需要一个整数值,并且不管是否使用十六进制表示法创建该值。
如果函数调用不能使用正确的常量,则其他问题是错误的。
慕容708150
TA贡献1831条经验 获得超4个赞
万一有兴趣的人,问题是我得到的返回0表示函数运行正常。我需要的是函数实际返回的浮点数,该浮点数是通过使用restype方法并将其设置为ctypes.c_double获得的。输入的十六进制问题导致出现红色鲱鱼,但是对于学习Python和C如何处理十六进制值非常有用。
添加回答
举报
0/150
提交
取消