1

嗨,我在运行我的程序时遇到问题。这部分代码有异常“向量迭代器不兼容”backtrack(params, set, results);

你可以在这个链接上看到完整的代码http://liveworkspace.org/code/MjgyND $7

ps > 在 XCode 中的 MacOS 上一切正常,但在 VS 2012 (Win7) 上我有这个错误..

ps > 在 liveworkspace 上工作正常。可能需要修改编译器设置?

int backtrack(btIData params, std::vector<float> set, std::vector<btNode> &results)
{
    if (reject(params, set)) {
        return 0;
    } else {
        accept(params, set, results);
    }

    set = first(params,set);
    while( (set.size() != 0) || reject(params, set)) {
        backtrack(params, set, results);
        set = right(params,set);
    }

    return 0;
}
4

2 回答 2

1

好吧,您是否尝试使用调试器?如果有,你发现了什么?如果不是,那么这不完全是一个“为我调试我的代码”网站。

无论如何,如果没有额外的应用领域知识,很难弄清楚你的代码在做什么。而且调试起来非常麻烦,因为您按值传递了很多容器。

然而,一个形式上的错误是相当明显的。您的rightandfirst函数会将set数组(从backtrack)增加到大于params.input数组大小的大小。例如,如果您的params.input数组有大小5(如在您的测试代码中),您的set数组将增长到 size 6

两个函数中的这种情况显然应该限制set数组的增长

int l = (int) candiates.size(); // `candiates` is `set`
if (l > params.input.size())
  // Don't grow array
else
  // Grow array

但由于某种原因,您使用了严格比较l > params.input.size()而不是非严格比较l >= params.input.size()。当只有元素时,这正是允许您的set数组增长到 size的原因。6params.input5

然后稍后在您使用索引值从togetPathSummary迭代input数组0sets.size() - 1

float getPathSummary(btIData params, std::vector<float> sets)
{
    float summary = 0;
    for (int i =0; i < sets.size(); i++) {
        summary += params.input[i] * sets[i];
    }

    return summary;
}

这会导致索引超出范围并导致程序崩溃。即您尝试访问params.input[5]不存在的 。

越界访问尝试将在标准库的不同调试实现中产生不同的运行时错误。在您的情况下,它恰好与“不兼容的迭代器”有关。

PS 停止按值传递繁重的数据结构。使用参考。

于 2012-12-26T00:30:38.913 回答
0

如果 btNode 类是在另一个 DLL 中定义的,并且模板 std::vector 在该 DLL 中被引用,则根据用于构建代码的标准库的版本和用于构建外部 DLL 的标准库的版本,您可能会遇到不兼容性。

但在你的情况下,一切似乎都存在于同一个文件中

于 2012-12-26T00:25:09.313 回答