2016-06-08 4 views
4

이 잘 컴파일 :긴 INT는 * np_intp하는 * 플랫폼에 의존 변환 내 64 비트 오피스 바탕 화면에서

#include <Python.h> 
#include <numpy/arrayobject.h> 

... 

Py_Initialize(); 
import_array(); 

// Build array object 
long int NUMEL=3; 
PyObject *out_array = PyArray_SimpleNew(1, &NUMEL, NPY_DOUBLE); 

을 반대로 내 32 비트 노트북에이 오류 생산 실패

error: invalid conversion from ‘long int*’ to ‘npy_intp* {aka int*}’ [-fpermissive] 
    PyArray_New(&PyArray_Type, nd, dims, typenum, NULL, NULL, 0, 0, NULL) 

또는 int NUMEL=3을 대신 선언하면 코드는 32 비트 컴퓨터에서는 컴파일되지만 64 비트 컴퓨터에서는 컴파일되지 않습니다. 나는 npy_intp이 플랫폼에 종속되어 있다고 생각합니다. NUMELnpy_intp 유형으로 정의 할 수 없기 때문에 (실제로 다른 C/C++ 전용 루틴에서 전달되는 것처럼), 조건부로 C++ 코드 내의 플랫폼에 따라 NUMEL을 정의하는 방법이 있습니까?

답변

2

npy_intp된다 typedef '로 here 에드 :

typedef Py_intptr_t npy_intp; 

그리고 Py_intptr_tpyport.h에서 파이썬 C 원에 정의되어있다. 시스템에 따라 크게 달라 지지만 대부분의 경우 Microsoft의 Visual C가 C89 인 경우를 제외하고는 stdint.h이며이를 포함시키고 intptr_t을 입력하면됩니다. C++에서 이것은 std::ptrdiff_t으로, 부호가없는 대응 물인 std::size_t을 살펴보십시오. 당신이 같은 이상한 코너 케이스 시스템에 이식 할 수 없습니다 찾을 수 있지만, 거의 모든 플랫폼에서 작동합니다

#if sizeof(void *) <= sizeof(int) 
    typedef int my_type; 
#elif sizeof(void *) <= sizeof(long) 
    typedef long my_type; 
#else 
    typedef long long my_type; 
#endif 

: 최후의 수단으로

, 당신은 항상 파이썬은 같은과 함께 무엇을 복제 할 수 .

+0

감사합니다. 나는'stdint.h' (주로 자기 학습자)의 존재를 무시했다. 그래서 올바르게 입력했다면'NUMEL'은'intN_t' 타입으로 주어질 수 있습니다. 그러나'NUMEL'을'PyArray_SimpleNew'에 넘기는 함수는 반드시'intptr_t'로 전달해야합니다. 그럼에도 불구하고 이것은 intN_t에서 intptr_t 로의 캐스팅이 자동으로 수행되는 한 문제가되지 않습니다. – maurizio