2012-09-12 7 views
4
내가하는 ctypes와 놀겠다는 거하고

... 나는 C 코드파이썬 INT 오버 플로우

편집 다음 한하는 ctypes 함수를 호출 할 때 :이 알아 내려고 노력하고있어 이유는 this blog post 더 정확한 확인하는 것입니다

sumrange.c 내가

$ gcc -shared -Wl,-install_name,sumrange.so -o ./sumrange.so -fPIC ./sumrange.c 
01 (OSX에) 다음 명령을 사용하여 컴파일 할

#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; 
} 

23,516,

내가 파이썬에서 동일한 기능을 구현했습니다 :

>>> import ctypes 
>>> sumrange = ctypes.CDLL('./sumrange.so') 
>>> pysumrange = lambda arg: sum(xrange(arg)) 
>>> print sumrange.sumrange(10**8), pysumrange(10**8) 
... 887459712 4999999950000000 

을 ... 그리고 번호가 일치하지 않습니다

pysumrange = lambda arg: sum(xrange(arg)) 

은 그 때 나는 모두가 대화식 쉘에서 실행합니다. 왜 이럴 수 있니?

효과 (동일한 출력)없이 C 코드의 모든 변수에 unsigned long long을 사용해 보았습니다.

+1

, 나는 NumPy와 버전을 사용하고 파이썬과 C. –

+0

관련 사이 좋게 떨어진다 : http://stackoverflow.com/questions/23522055/error-when-unload-a-64bit-dll-using-ctypes-windll –

답변

4

long은 32 비트 유형이므로 C 코드가 단순히 오버플로됩니다.

파이썬은 그렇지 않습니다. pysumrange은 정확한 답을줍니다.

ctypes 당신이 말하지 않으면 함수의 반환 형식이 unsigned long long임을 알지 못합니다. Python 표준 라이브러리 문서의 return types을 참조하십시오. 그것은 :

기본적으로 함수는 C int 유형을 반환한다고 가정합니다. 다른 리턴 유형은 함수 오브젝트의 restype 속성을 설정하여 지정할 수 있습니다.

그래서 아마 그냥 함수를 호출하기 전에, 당신을 위해 작동합니다,이 일을 : 당신의 블로그 게시물에 대한

sumrange.sumrange.restype = ctypes.c_ulonglong 
+2

ctypes 함수에 대한 argtypes도 설정하는 것이 좋습니다. 'sumrange.sumrange.argtypes = [ctypes.c_long]' –