swig 在 C++ 中运行的结果与在 python 中的不同

Posted

技术标签:

【中文标题】swig 在 C++ 中运行的结果与在 python 中的不同【英文标题】:The result of swig running in C++ is different from that in python 【发布时间】:2019-11-08 08:05:14 【问题描述】:
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】:

你的代码对我来说很合适。创建一个可重现的问题示例。这是我的演示模板正在工作的示例(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)]

【讨论】:

以上是关于swig 在 C++ 中运行的结果与在 python 中的不同的主要内容,如果未能解决你的问题,请参考以下文章

从 Django 框架运行 C++ 程序

是啥导致在单元测试(NUnit 或 MSTest)中从 C# 调用的 C++ 函数与在控制台应用程序中运行的相同代码产生不同的结果?

使用 SWIG 跨 C++ 和 Ruby 的多态性

动态链接和 Python SWIG (C++) 在 C++ 中工作在 python 中失败

通过 SWIG 链接 C++ 和 Java GUI

SWIG:你能否使用 SWIG 专门使用 C++ 头文件使 C++ 在 Python 中可用?