long int* 到 np_intp* 平台相关的转换
long int* to np_intp* platform dependent conversion
在我的 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
是平台相关的。由于我无法定义 npy_intp
类型的 NUMEL
(实际上它由其他 C/C++-only 例程传递),是否有条件地定义 NUMEL
取决于在 C++ 代码的平台上?
npy_intp
被 typedef
编辑 here 为:
typedef Py_intptr_t npy_intp;
而Py_intptr_t
在pyport.h
. It is highly system dependent, see that source for details, but for most cases, unless you are dealing with Microsoft's Visual C being C89, you have stdint.h
and can simply include it and use intptr_t
as your type. In C++ this comes as std::ptrdiff_t
, take a look also at its unsigned counterpart, std::size_t
的Python C源代码中定义。
作为最后的手段,您总是可以复制 Python 所做的事情,例如:
#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
它几乎可以在所有平台上运行,尽管您可能会发现它不能移植到同一个奇怪的角落案例系统。
在我的 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
是平台相关的。由于我无法定义 npy_intp
类型的 NUMEL
(实际上它由其他 C/C++-only 例程传递),是否有条件地定义 NUMEL
取决于在 C++ 代码的平台上?
npy_intp
被 typedef
编辑 here 为:
typedef Py_intptr_t npy_intp;
而Py_intptr_t
在pyport.h
. It is highly system dependent, see that source for details, but for most cases, unless you are dealing with Microsoft's Visual C being C89, you have stdint.h
and can simply include it and use intptr_t
as your type. In C++ this comes as std::ptrdiff_t
, take a look also at its unsigned counterpart, std::size_t
的Python C源代码中定义。
作为最后的手段,您总是可以复制 Python 所做的事情,例如:
#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
它几乎可以在所有平台上运行,尽管您可能会发现它不能移植到同一个奇怪的角落案例系统。