Swig 和多维数组

2023-12-11

我正在使用 Swig 将 python 与 C 代码连接起来。

我想调用一个 C 函数,该函数接受一个包含 int** var 的结构体作为参数:

typedef struct
{
    (...)
    int** my2Darray;
} myStruct;

void myCFunction( myStruct struct );

我正在努力处理多维数组。

我的代码如下所示:

在接口文件中,我使用这样的carray:

%include carrays.i
%array_class( int, intArray );
%array_class( intArray, intArrayArray );

在Python中,我有:

myStruct = myModule.myStruct()
var = myModule.intArrayArray(28)

for j in range(28):
    var1 = myModule.intArray(28)

    for i in range(28):
        var1[i] = (...) filling var1 (...)

    var[j] = var1

myStruct.my2Darray = var

myCFonction( myStruct )

我收到一条错误消息myStruct.my2Darray = var:

TypeError: in method 'maStruct_monTableau2D_set', argument 2 of type 'int **'

我对线路表示怀疑%array_class( intArray, intArrayArray )。 我尝试使用 typedefint*像这样创建我的数组:%array_class( myTypeDef, intArrayArray );但这似乎不起作用。

你知道如何在 Swig 中处理多维数组吗?

感谢您的帮助。


您是否考虑过使用numpy为了这?我已将 numpy 与我的 SWIG 包装的 C++ 项目一起用于处理 double 和 std::complex 元素的 1D、2D 和 3D 数组,并取得了很大成功。

你需要获取 numpy.i并在 python 环境中安装 numpy。

以下是如何构建它的示例:

.i file:

// Numpy Related Includes:
%{
#define SWIG_FILE_WITH_INIT
%}
// numpy arrays
%include "numpy.i"
%init %{
import_array(); // This is essential. We will get a crash in Python without it.
%}
// These names must exactly match the function declaration.
%apply (int* INPLACE_ARRAY2, int DIM1, int DIM2) \
      {(int* npyArray2D, int npyLength1D, int npyLength2D)}

%include "yourheader.h"

%clear (int* npyArray2D, int npyLength1D, int npyLength2D);

.h file:

/// Get the data in a 2D Array.
void arrayFunction(int* npyArray2D, int npyLength1D, int npyLength2D);

.cpp 文件:

void arrayFunction(int* npyArray2D, int npyLength1D, int npyLength2D)
{
    for(int i = 0; i < npyLength1D; ++i)
    {
        for(int j = 0; j < npyLength2D; ++j)
        {
            int nIndexJ = i * npyLength2D + j;
            // operate on array
            npyArray2D[nIndexJ];
        }
    }
}

.py 文件:

def makeArray(rows, cols):
    return numpy.array(numpy.zeros(shape=(rows, cols)), dtype=numpy.int)

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

Swig 和多维数组 的相关文章

随机推荐

  • pyad:安装正常,但说找不到 adbase

    这让我很困惑 我已经使用 pip 安装了 pyad 一切看起来都很好 C WINDOWS system32 gt pip install pyad Collecting pyad Using cached pyad 0 5 16 tar g
  • 无法在 eclipse 中安装 Oracle Weblogic Server Tools

    从 eclipse 安装 Oracle Weblogic Server Tools 时遇到此错误 正在安装的软件 Oracle WebLogic Server Tools 17 2 0 201806071916 oracle eclipse
  • 参数类型不兼容并且在此函数中未初始化

    当我调用它时 我的一个 两个方法出现问题main 我不确定为什么 int main struct list list list init list while TRUE struct book book1 printf Enter titl
  • 没有索引声明的 for 循环

    所以我在某个地方声明一个变量并初始化它 现在稍后我需要使用它来循环 同时它仍然为正 所以我需要减少它 对我来说 使用条件和递减循环需要 for 但对于它我们缺少初始化的第一部分 但我不需要初始化任何东西 那么我该如何以一种好的方式来解决这个
  • 在智能感知中显示异常?

    我正在使用 Visual Studio 2013 Ultimate 在 C 代码编辑器中 可以通过 Intellisense 列出已记录异常的成员 我的问题是 如何为 VB Net 添加这个有用的功能 是否有第 3 方扩展可以添加它 为什么
  • 在 bash 的 for 循环中使用“ls”是否安全

    我用它来循环 home 目录中的文件夹 for FOLDERNAME in ls 1 home 我想知道安全吗 如果您想要所有子目录 home use run in subshell so shopt s dotglob doesn t a
  • EF Core 多对多自加入

    我试图描述与 Entity Framework Core 2 的多对多自引用关系 本质上 我试图建模的是一种树结构 其中每个元素可以具有任意数量的父元素和子元素 所以我想更多的是图表而不是树 这是我到目前为止所拥有的 public clas
  • 在 C++ Builder 中实现 VirtualTreeView TVTDefaultAccessibleProvider

    当使用 VirtualStringTree 添加辅助功能支持时 需要包含该单元VirtualTrees Accessibility in the uses部分 这在德尔福中有效 在 C Builder 中相当于包含 include Virt
  • 基于条件类型的狭义类型(Typescript)

    我想创建需要可选参数之一的函数类型 据我所知 是制作条件类型 但问题是在函数打字稿中无法根据此条件缩小类型 type a propA number type b propB string type OneOfIsRequired
  • CreateObject("Scripting.FileSystemObject") 在 Excel for Mac 下不起作用 [重复]

    这个问题在这里已经有答案了 我有一段 VBA 代码 用于获取给定路径的子文件夹 它在以下情况下运行良好Excel for Windows Function GetSubFolders RootPath As String Dim fso A
  • 无法将 scipy 安装到 Raspberry pi 4 (raspbian)

    我正在尝试安装scipy图书馆与python3 m pip install user no use pep517 scipy但我收到以下错误 ERROR Failed building wheel for scipy Running set
  • Instant App,实际最低sdk是多少

    根据 Android 开发者网站 Instant 应用程序的最低 sdk 是 21 即 5 0 link 该网站明确指出 Android Instant Apps 可在大多数运行 Android 的设备上使用5 0 API 级别 21 和更
  • 如何从firebase数据库flutter中的地图获取值

    我有一个像这样的 json 结构 My6relBpWvPaY I4JvN idUser 4dca8440 a37d 11ec 9c66 9b8f61be17f0 message 777777 我想使用 fromJson 保存到地图 这是我的
  • 如何将后续意图上传到另一个父意图

    I m trying to upload a previously downloaded follow up intent in json to another parent intent with no success in the Di
  • 如何使用 pywinauto 控制 IE 浏览器

    好的 所以我想用 pywinauto 控制 IE Explorer 我想选择页面上的文本字段并编辑它们 有没有一种方法可以使用 pywinauto 执行此操作 而无需单击文本字段的位置 每次页面都是相同的 但输入的数据却不同 窗口可能不会每
  • OCaml 模块中的抽象类型

    我在 OCaml 中有非常简单的签名和模块 module type S sig type t val y t end and module M2 S struct type t int let x 1 let y x 2 end 我不能使用
  • PyQt 按钮单击和释放处理程序

    我想在单击按钮时添加一个功能 发布时还有另一个功能 clicked connect 方法仅在释放按钮时触发一个函数 因此在我的情况下它不起作用 button clicked connect button clicked connect bu
  • 通过 vbs 永久按键(按住按键)

    我编写了这个小 vbs 脚本来在 Chrome 浏览器中按向左箭头键 set WshShell WScript CreateObject WScript Shell WshShell AppActivate Google Chrome Ws
  • 如何打开黑莓电子邮件应用程序,准备向给定地址撰写电子邮件?

    在我的 Blackberry 应用程序中 我有一个电子邮件地址 希望用户能够向其发送电子邮件 我想让内置的电子邮件应用程序运行撰写屏幕 并在 收件人 字段中填写我提供的电子邮件地址 类似于桌面邮件客户端响应 mailto 链接的方式 API
  • Swig 和多维数组

    我正在使用 Swig 将 python 与 C 代码连接起来 我想调用一个 C 函数 该函数接受一个包含 int var 的结构体作为参数 typedef struct int my2Darray myStruct void myCFunc