2014-10-30 4 views
0

ctype을 사용하여 C 함수에 액세스하는 방법을 테스트하는 간단한 C 라이브러리 파일을 만들었습니다.ctypes가있는 C 라이브러리 모듈을 호출하면 잘못된 결과가 나타납니다.

는 C라는 이름의 파일 tetr.c의 기능을 읽

double square(double x){ 
    return x*x; 
} 

는 그래서 수의 제곱을 반환합니다.

것은 나는 다음과 같은 사용하여 오브젝트 파일로 컴파일했습니다

gcc -c tetr.c -o tetr.o 

과 공유 객체 파일에

사용 :

gcc -shared -Wl,-soname,library.so -o tetr.so tetr.o 

지금까지 너무 좋아. 내가 ipython 쉘을 호출하고 내 라이브러리 LIB 변수로 설정 : 내가 lib.square(ctypes.c_double(2.0)) 전화 줄 때

import ctypes 
lib = ctypes.cdll.LoadLibrary("tetr.so") 

는 물론, 그것은 나에게 4.0를 제공해야합니다. 대신 1이 나옵니다. 그리고 함수 제곱에 삽입 한 모든 숫자, 심지어 0으로도 마찬가지입니다.

짧은 통지, 나는 제로를 얻을 수 있기 때문에 그없이 내 함수 내에서 ctypes.c_double를 사용했을 때 입력 정수 및

ArgumentError: argument 1: <type 'exceptions.TypeError'>: Don't know how to convert parameter 1 

때 입력 더블 부동 소수점 /.

내가 잘못하고 있을지도 모르는 아이디어가 있습니까?

+1

너무 반환 값을 (캐스팅)로 변환해야합니까? –

+0

내가 왜해야하는지 모르겠다. 그 생각에 감사드립니다. – milia

+0

아니, 같은 결과. – milia

답변

1

ctypes에 함수가 double을 반환하도록 지시해야합니다. 그 자체를 이해할 수는 없으므로 그렇지 않으면 말하지 않는 한 모든 함수의 반환 유형은 int으로 가정합니다. 예를 들어 https://docs.python.org/2/library/ctypes.html#return-types

를 참조하십시오

import ctypes 
lib = ctypes.cdll.LoadLibrary("tetr.so") 
lib.square.restype = ctypes.c_double 
ret = lib.square(ctypes.c_double(2.0)) 
관련 문제