c++ - long int* 到 np_intp* 平台相关转换

标签 c++ numpy 32bit-64bit python-c-api

在我的 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++ 例程传递的),是否有条件地定义 NUMEL 取决于 C++ 代码中的平台?

最佳答案

npy_intptypedefhere成为:

typedef Py_intptr_t npy_intp;

并且 Py_intptr_tpyport.h 中的 Python C 源代码中定义。 .它高度依赖于系统,请参阅该源以获取详细信息,但在大多数情况下,除非您处理 Microsoft 的 Visual C 是 C89,否则您有 stdint.h 并且可以简单地包含它并使用 intptr_t 作为你的类型。在 C++ 中,这是 std::ptrdiff_t。 , 也看看它未签名的拷贝,std::size_t .

作为最后的手段,您总是可以复制 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

它几乎可以在所有平台上运行,尽管您可能会发现它不能移植到同一个奇怪的角落案例系统。

关于c++ - long int* 到 np_intp* 平台相关转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37693169/

相关文章:

python - 创建运算矩阵张量

visual-studio-2010 - 在 64 位系统上使用 32 位 dll 显示 0x8007000B 错误

ant - ANT 可以参数化 InnoSetup 脚本吗?

android - 在 Android NDK 上创建映射/直接 OpenGL ES 纹理

c++ - 服务器重启后重新连接到 QDBus 服务器(Qt C++)

c++ - SDL2 : Fast Pixel Manipulation

python - 逐行比较二维数组

python - 如何解决 numpy.around() 中的 -0 问题

c++ - 解析、词法分析、C++ 内存错误

c# - 在 64 位 Office 插件中加载 32 位 COM dll