使用SWIG将Python数组传递给c ++函数并将向量返回到Python数组

时间:2014-08-03 02:50:52

标签: python c++ swig

我在尝试制定如何使用SWIG / C ++ / python

返回向量时遇到问题

我可以将一个列表发送到一个向量,递增它,但是然后想要发送它(或者它的一个子集再次返回到python,这样它可以显示列表或子列表的结果

此示例有效:

test.i

%module test
%{
#include "test.h"
%}

%include "std_vector.i"

namespace std {
%template(Line)  vector < int >;
    %template(Array) vector < vector < int> >;
}   

void print_array(std::vector< std::vector < int > > myarray);

test.h

#ifndef TEST_H__
#define TEST_H__

#include <stdio.h>
#include <vector>

void print_array(std::vector< std::vector < int > > myarray);

#endif /* TEST_H__ */

TEST.CPP

#include "test.h"

void print_array(std::vector< std::vector < int > > myarray)
{
    for (int i=0; i<2; i++)
        for (int j=0; j<2; j++)
            printf("[%d][%d] = [%d]\n", i, j, myarray[i][j]);
}

如果运行以下python代码,则表明它可以正常工作

>>> import test
>>> a = test.Array()
>>> a = [[0, 1], [2, 3]]
>>> test.print_array(a)
[0][0] = [0]
[0][1] = [1]
[1][0] = [2]
[1][1] = [3]

尝试在此处进行修改:

test.i

%module test
%{
#include "test.h"
%}

%include "std_vector.i"

namespace std {
%template(Line)  vector < int >;
    %template(Array) vector < vector < int> >;
}   

std::vector< std::vector < int > print_array(std::vector< std::vector < int > > myarray);

test.h

#ifndef TEST_H__
#define TEST_H__

#include <stdio.h>
#include <vector>

std::vector< std::vector < int > print_array(std::vector< std::vector < int > > myarray);

#endif /* TEST_H__ */

TEST.CPP

#include "test.h"

std::vector< std::vector < int > print_array(std::vector< std::vector < int > > myarray)
{
    for (int i=0; i<2; i++)
        for (int j=0; j<2; j++)
            printf("[%d][%d] = [%d]\n", i, j, myarray[i][j]);

    std::vector<int>   sub(&myarray[0],&myarray[2]);
    return sub;
}

这是从swig返回向量的有效方法吗?

1 个答案:

答案 0 :(得分:1)

如果您发布的代码确实是您正在使用的代码,那么您将缺少“&gt;”。为清晰起见,复杂的模板类是最好的类型,并避免这种拼写错误。例如,在.h中,尝试:

typedef std::vector< std::vector < int > > VecVecInt;
VecVecInt print_array(VecVecInt myarray);

请注意,您将向量作为值传递给函数,因此所有向量项都将复制到函数的临时值。由于这是矢量的矢量,这可能相当昂贵。考虑使用const VecVecInt&