指针类型与 PyArray_SimpleNew 不匹配

2024-06-28

我正在使用 C API 使用 Numpy 创建 Python 模块,并遇到与输出的奇怪的不兼容问题PyArray_SimpleNew,我想了解一下。但首先是一个最小的例子:

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

void foo()
{
    Py_Initialize();
    import_array();

    npy_intp dims[1] = {42};
    PyObject * A = PyArray_SimpleNew(1,dims,NPY_DOUBLE); // Line A

    Py_Finalize();
}

int main()
{
    foo();
    return 0;
}

如果我用以下命令编译它gcc source.c -lpython2.7 -I/usr/include/python2.7 --pedantic,我得到(参考 A 行):

ISO C 禁止将对象指针转换为函数指针类型

所以,显然,PyArrayObject由于某种原因,s 应该是函数指针。


根据文档(例如,here http://docs.scipy.org/doc/numpy/user/c-info.how-to-extend.html#creating-a-brand-new-ndarray), PyArray_SimpleNew有一个返回类型PyObject *因此上面的内容应该完全没问题。此外,我没有收到其他函数返回的类似警告PyObject *.

现在,虽然这只是我们正在讨论的警告,但我的程序使用PyArray_SimpleNew按预期工作,所有这些都表明 Numpy C API 没有像我想象的那样工作(或者有错误)。因此我想了解这背后的原因。


我在以下系统上生成了上述内容:

  • GCC 4.7.2(Debian 4.7.2-5)、Numpy 1.6.2
  • GCC 4.8.2(Ubuntu 4.8.2-19ubuntu1),Numpy 1.8.2

在这两种情况下,情况都会改变# define NPY_NO_DEPRECATED_API NPY_1_8_API_VERSION.


为了回答您为什么收到有关“ISO C 禁止将对象指针转换为函数指针类型”的警告的问题,我检查了 numpy 的源代码。

PyArray_SimpleNew是一个定义在的宏numpy/ndarrayobject.h第 125 行:

#define PyArray_SimpleNew(nd, dims, typenum) \
        PyArray_New(&PyArray_Type, nd, dims, typenum, NULL, NULL, 0, 0, NULL)

将 A 行展开为:

PyObject * A = PyArray_New(&PyArray_Type, 1, dims, typenum, NULL, NULL, 0, 0, NULL); // Line A

PyArray_New本身是一个定义在的宏numpy/__multiarray_api.h1017行:

#define PyArray_New \
        (*(PyObject * (*)(PyTypeObject *, int, npy_intp *, int, npy_intp *, void *, int, int, PyObject *)) \
         PyArray_API[93])

将 A 行展开为:

PyObject * A = (*(PyObject * (*)(PyTypeObject *, int, npy_intp *, int, npy_intp *, void *, int, int, PyObject *))
                PyArray_API[93])(&PyArray_Type, 1, dims, typenum, NULL, NULL, 0, 0, NULL); // Line A

这个复杂的表达式可以简化为:

// PyObject * function93(PyTypeObject *, int, npy_intp *, int, npy_intp *, void *, int, int, PyObject *)
typedef PyObject * (*function93)(PyTypeObject *, int, npy_intp *, int, npy_intp *, void *, int, int, PyObject *);

// Get the PyArray API function #93, cast the function pointer to its
// signature, and call it with the arguments to `PyArray_New`.
PyObject * A = (*(function93) PyArray_API[93])(&PyArray_Type, 1, dims, typenum, NULL, NULL, 0, 0, NULL); // Line A

导致禁止转换的部分是:

*(function93) PyArray_API[93]

In numpy/__multiarray_api.h第 807、810 和 812 行PyArray_API是 声明为void **. So PyArray_API[93] is a void *(即一个对象 指针),它被转换为函数指针。

我不太熟悉 NumPy 或其 C-api,但看起来你很熟悉 正确使用它。 NumPy 只是碰巧使用了一些非标准的、未定义的 GCC 支持但 ISO 标准不支持的内部行为(即 NumPy 不能通过 ISO 标准移植)。

也可以看看[SciPy-User] NumPy C API:将对象指针转换为函数指针从何而来? http://mail.scipy.org/pipermail/scipy-user/2012-June/032371.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

指针类型与 PyArray_SimpleNew 不匹配 的相关文章

随机推荐

  • 由于键名复杂,无法访问 JavaScript 数组成员

    我有一个javascript questions tagged javascriptarray http schemas microsoft com ws 2008 06 identity claims role Admin http sc
  • 运行子进程并将输出打印到日志记录

    我正在寻找从 python 调用 shell 脚本并使用日志记录将其 stdout 和 stderr 写入文件的方法 这是我的代码 import logging import tempfile import shlex import os
  • C# 中任务的 System.InvalidOperationException

    我试图通过使用任务 Parallel foreach 使我的代码更快 这是我更新的代码 int intImageW intImageH Bitmap bmpDest new Bitmap 1 1 DateTime creationTime
  • 解释 tf diff

    使用 Visual Studio 2008 工具 我正在尝试获取更改集 14318 和 14317 的 ASCII 差异 我可以使用 GUI 来做到这一点 tf changeset 14318 然后选择一个文件并右键单击并选择与以前的版本进
  • Xcode 8 - 丢失文件警告

    自从使用 Swift 2 3 升级到 Xcode 8 我有几个丢失文件的警告 它们都与我正在使用的 pod 有关 丢失的文件是 xcscheme cpp xcuserstate swift 显示丢失文件的 pod 是 领域 38 43 Te
  • 如何在张量流中将张量的某些值设置为零值?

    我想要稀疏卷积核 所以我需要在训练过程中将内核中的一些值设置为零值 张量流中是否有一些API可以帮助我实现我的想法 将张量中的某些值设置为零 您可以使用tf boolean mask https www tensorflow org api
  • Django 视图有一个意外的关键字参数

    我有以下网址模式 urlpatterns pattern url r edit offer P
  • 媒体查询在 IE9 中不起作用

    我遇到了一个奇怪的问题 只有 IE9 才会出现 我正在开发一个具有桌面布局和移动布局的网页 相同的 HTML 不同的 CSS 问题发生在下面的代码中 media only screen and min device width 768px
  • 如何在Delphi XE4中将富文本RTF转换为纯文本或HTML?

    在 Delphi XE4 FireMonkey 中 我在来自数据库的流中有一些 RTF 它仅使用字体 大小 粗体和斜体 如何提取纯文本或将其转换为 HTML 我可以以某种方式使用JVCL s即使我正在使用组件FireMonkey None
  • 加速结构化 NumPy 数组

    NumPy数组在性能和易用性方面都非常出色 比列表更容易切片 索引 我尝试构建一个数据容器NumPy structured array代替dict of NumPy arrays 问题是性能要差得多 使用同质数据的情况大约是 2 5 倍 而
  • 在 WSO2 ESB 4.6 中访问已发布的 WS 代理时出错:找不到 EPR

    我在 4 5 1 和 4 6 中部署了完全相同的 WS proxy 在 4 5 1 中它可以正常工作 但在 4 6 中我得到 ERROR AxisEngine The endpoint reference EPR for the Opera
  • 如何解析日期格式?

    在我的应用程序正在使用的 Web 服务之一中 我遇到了以下日期时间格式 Date 1395780377459 这是某种标准的日期格式吗 如果是这样 如何将其解析为 DateTime 对象 EDIT 感谢您的评论 所以 Date 139578
  • 关闭 Quartz .Net 中的调试日志记录

    我正在使用 Quartz NET 在我们的应用程序中安排一些自定义任务 一切工作正常 只是它在一秒钟内记录大约二十个调试条目 我不知道如何关闭调试日志记录 任何帮助将非常感激 因为我一直试图在网上查找但没有运气 调试条目如下所示 DEBUG
  • 如何在 Rails 中为不在模型文件夹根目录中的模型定义工厂女孩?

    我想为我的服务器中的模型创建一个工厂女孩 该模型位于模型文件夹的文件夹内 我的树视图如下所示 app models xxx user rb spec factories xxx user rb 我的工厂女工长这样 FactoryGirl d
  • C++ 限制语义

    我正在更新性能关键库以使用限制 如 g 和 MSVC 在 C 11 中使用关键字实现的那样 restrict 这似乎是最标准的扩展 所以我将使用restrict and restrict可以互换 restrict是一个 C99 关键字 但编
  • 如何手动向我刚刚生成的进程发送消息?

    如何使用 Erlang 发送消息进行处理 我确实启动了一个进程 输出显示 pid 进程标识符 是 lt 0 39 0 gt 我的问题是如何向此进程发送消息 lt 0 39 0 gt 手动 While list to pid 1确实可以用来构
  • 直接将数据放入AppEngine的Blobstore中

    AppEngine 的标准 API 假定文件是从 HTML 表单上传的 我正在尝试从可由非 Html 客户端 Flash iPhone 等 调用的 REST API 方法将文件发布到 blobstore 我试图运行的代码 Get the b
  • .NET 进程在 Windows 7 中进行 DNS 查找失败

    我有一个应用程序在 Windows 7 下 DNS 查找 System Net Dns GetHostEntry 失败 该应用程序在 XP 下工作正常 生成的错误是套接字错误代码 11003 WSANO RECOVERY 11003这是一个
  • 无法加载动态库“php_wincache.dll”?

    因为我已经使用 ASP NET 所以我决定在 IIS 上使用 PHP 我使用 Wep PI 安装它 但是当我尝试安装 Composer 时 他失败并出现 PHP 设置错误 我尝试将 php ini 中的 extension dir 更改为绝
  • 指针类型与 PyArray_SimpleNew 不匹配

    我正在使用 C API 使用 Numpy 创建 Python 模块 并遇到与输出的奇怪的不兼容问题PyArray SimpleNew 我想了解一下 但首先是一个最小的例子 include