SWIG,将Python列表传递给C++

2024-09-27 09:31:40 发布

您现在位置:Python中文网/ 问答频道 /正文

<>我尝试创建比较两个向量的C++扩展。

ddd.h文件

using namespace std;

#include <vector>
#include <algorithm>
#include <functional>
#include <numeric>
#include <iostream>
#include <assert.h>
#include <cstring>

vector<bool> comparer_cpp(vector<vector<string> > v, vector<string> v0);

ddd.i文件

%module ddd

%{
#define SWIG_FILE_WITH_INIT
#include "ddd.h"
%}

%include "std_vector.i"

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

%{
extern vector<bool> comparer_cpp(vector<vector<string> > v, vector<string> v0);
// extern vector<string> Line;
// extern vector<vector<string> > Array;
%}


%include ddd.h
extern vector<bool> comparer_cpp(vector<vector<string> > v, vector<string> v0);
// extern vector<string> Line;
// extern vector<vector<string> > Array;

ddd.cpp文件

#include "ddd.h"

// vector<bool> comparer_cpp(const vector<vector<string> >& v, const vector<string>& v0) {
  vector<bool> comparer_cpp(vector<vector<string> > v, vector<string> v0) {

  
    vector<bool> result;

    for(unsigned int i=0;i<v.size();i++)
    {
      result.push_back((v0==v[i]));
    }

    // for(unsigned int i=0;i<result.size();i++)
    // {
    //   cout<<result[i]<<endl;
    // }


    return result;
}

编译过程没有错误

<>但是,当我测试代码时,我不能把python列表传递给C++向量

>>> import ddd
>>> ddd.Line(["F06", "H10", "R07"])

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/young/Downloads/temp/cpp_swig_test/swig/ddd.py", line 201, in __init__
    _ddd.Line_swiginit(self, _ddd.new_Line(*args))
TypeError: Wrong number or type of arguments for overloaded function 'new_Line'.
  Possible C/C++ prototypes are:
    std::vector< string >::vector()
    std::vector< string >::vector(std::vector< string > const &)
    std::vector< string >::vector(std::vector< string >::size_type)
    std::vector< string >::vector(std::vector< string >::size_type,std::vector< string >::value_type const &)

我的最终目标是比较两个向量并得到以下结果

vec1d=ddd.Line(["F06", "H10", "R07"])
vec2d=ddd.Line([["F06", "H10", "R07"], ["F06", "H10", "L20"], ["F06", "H10", "S12"]])
result_tuple=ddd.comparer_cpp(vec2d,vec1d)

请纠正我的错误


Tags: stringincludelineexternresultcppboolstd
2条回答

SWIG既需要std_string.i来理解std::string,也需要std::vector<bool>的模板。下面是一个经过测试的示例:

ddd.i

%module ddd

%include "std_vector.i"
%include "std_string.i"
%template(Line)  std::vector<std::string>;
%template(Array) std::vector<std::vector<std::string>>;
%template(Result) std::vector<bool>;

%inline %{
#include <vector>
#include <string>

std::vector<bool> comparer_cpp(std::vector<std::vector<std::string>> v, std::vector<std::string> v0) {
    std::vector<bool> result;
    for(unsigned int i=0; i < v.size(); ++i) {
      result.push_back(v0 == v[i]);
    }
    return result;
}
%}

test.py

import ddd

vec1d = ddd.Line(["F06", "H10", "R07"])
vec2d = ddd.Array([["F06", "H10", "R07"], ["F06", "H10", "L20"], ["F06", "H10", "S12"]])
result = ddd.comparer_cpp(vec2d,vec1d)
print(result)

输出:

(True, False, False)

尝试为带有%include "std_string.i"的字符串包含相关的SWIG代码

相关问题 更多 >

    热门问题