Результат выполнения swig в C ++ отличается от результата в python - PullRequest
0 голосов
/ 08 ноября 2019
void BK::BKTree::recursiveSearchNew(BK::Node *node, std::vector<std::pair<std::string, int> > *r, string w,
                                size_t t) {
size_t curDist = levenshteinDistance(node->word, w);
size_t minDist = curDist - t;
size_t maxDist = curDist + t;

if (curDist <= t) {
    std::pair<string, int> p;
    p = std::make_pair(node->word, curDist);
    r->push_back(p);
}
Node* child = node->leftChild;
if (!child) return;

while (child)
{
    if (inRange(child->distance, minDist, maxDist))
        recursiveSearchNew(child, r, w, t);

    child = child->rightSibling;
}}

Эта рекурсивная функция компилируется с помощью swig, а вектор результатов возвращает только последний элемент, но c ++ возвращает нормальные результаты. Это файл .i:

%module bk
%include <std_pair.i> 
%include <std_vector.i> 
%include <std_string.i> 
%template() std::pair<std::string,int>; 
%template(PairVector) std::vector<std::pair<std::string,int> >; 
%template(StringVector) std::vector<std::string>;

%{ 
 #include "BKTree.h" 
%} 
 %include "BKTree.h" 

1 Ответ

0 голосов
/ 09 ноября 2019

Твой код выглядит прямо для меня. Создайте воспроизводимый пример вашей проблемы. Вот мой пример, демонстрирующий работу шаблонов (SWIG 3.0.12, VS2015, Python 3.8):

%module bk

%{

#include <vector>
#include <string>
#include <utility>

void test(std::vector<std::pair<std::string,int>> *r)
{
    auto p = std::make_pair(std::string{"hello"},5);
    r->push_back(p);
    p = std::make_pair("goodbye",7);
    r->push_back(p);
}

%}

%include <std_pair.i>
%include <std_vector.i>
%include <std_string.i>
%template() std::pair<std::string,int>;
%template(PairVector) std::vector<std::pair<std::string,int> >;

void test(std::vector<std::pair<std::string,int>> *r);

Вывод:

>>> import bk
>>> v=bk.PairVector()
>>> bk.test(v)
>>> list(v)
[('hello', 5), ('goodbye', 7)]
...