0

我正在使用 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

我尝试在不进行转换的情况下传递它,并将其转换为 int 使用ctypes.c_int(0x104),但该函数返回 0 而不是指针。我也尝试过不进行转换而获得相同的结果。

我应该执行更合适的转换吗?如果这是一个非常幼稚的问题,我有点 C n00b 很抱歉。

4

1 回答 1

4

Python 和 C 都允许您使用十六进制文字定义整数。它们被解释为 base-16,但它们的仍然是一个整数。它只不过是相同值的另一种表示法:

>>> 0x02
2
>>> 0x104
260
>>> import ctypes
>>> ctypes.c_int(0x104)
c_int(260)

您还可以使用八进制 ( 0o404, 或者,仅在 python 2 中,0404) 或二进制 ( 0b100000100) 表示法来指定相同的整数值。

签名指定它需要一个int,因此传入一个整数值。如果需要,可以在 Python 源代码中将该整数值指定为十六进制文字,但C 代码只需要一个整数值,而不关心您是否使用十六进制表示法来创建该值。

如果函数调用没有使用正确的常量,那么还有其他问题。

于 2013-05-24T23:51:21.283 回答