ГЛОТКОМ, передавая список python на C

#python #c #swig

Вопрос:

Я пытаюсь создать расширение 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> >amp; v, const vector<string>amp; v0) {
  vector<bool> comparer_cpp(vector<vector<string> > v, vector<string> v0) {

  
    vector<bool> resu<

    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 resu<
}
 

Компиляция проходит без ошибок

Однако, когда я тестирую код, я не могу передать список 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 amp;)
    std::vector< string >::vector(std::vector< string >::size_type)
    std::vector< string >::vector(std::vector< string >::size_type,std::vector< string >::value_type const amp;)
 

Моя конечная цель-сравнить два вектора и получить следующий результат

 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)
 

Пожалуйста, исправьте меня, что я сделал неправильно

Комментарии:

1. Это не ответ на ваш вопрос, но вы также можете рассмотреть pybind11.

Ответ №1:

Попробуйте включить соответствующий код SWIG для строк с. %include "std_string.i"

Ответ №2:

Вам нужно как std_string.i для понимания SWIG 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> resu<
    for(unsigned int i=0; i < v.size();   i) {
      result.push_back(v0 == v[i]);
    }
    return resu<
}
%}
 

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)