#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)