我在玩ctypes…我有下面的C代码
编辑:我试图弄清楚这一点的原因是为了让这篇博客文章更正确
sumrange.c
#include <stdio.h>
long sumrange(long);
long sumrange(long arg)
{
long i, x;
x = 0L;
for (i = 0L; i < arg; i++) {
x = x + i;
}
return x;
}
我使用以下命令(在OSX上)编译
$ gcc -shared -Wl,-install_name,sumrange.so -o ./sumrange.so -fPIC ./sumrange.c
我在python中实现了相同的功能:
pysumrange = lambda arg: sum(xrange(arg))
然后我在交互式shell上运行两者:
>>> import ctypes
>>> sumrange = ctypes.CDLL('./sumrange.so')
>>> pysumrange = lambda arg: sum(xrange(arg))
>>> print sumrange.sumrange(10**8), pysumrange(10**8)
... 887459712 4999999950000000
…而且数字不匹配。为什么会这样?
我尝试对C代码中的所有变量使用unsigned long long
,但没有效果(输出相同)。
long
是32位类型,因此C代码只是溢出。
Python没有;pysumrange
给出了正确答案。
ctypes
不知道函数的返回类型是unsigned long long
,除非你告诉它。请参阅Python标准库文档中的返回类型。上面写着:
默认情况下,假定函数返回C
int
类型。其他返回类型可以通过设置函数对象的restype
属性来指定。
因此,也许在调用函数之前这样做对您有用:
sumrange.sumrange.restype = ctypes.c_ulonglong