1

こんにちは、プログラムを実行するときに問題が発生しました。コードのこの部分に例外「Vector iterators incompatible」があります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

さて、デバッガを使用しようとしましたか? もしそうなら、何を見つけましたか?そうでない場合、これは正確には「自分のコードをデバッグする」Web サイトではありません。

いずれにせよ、アプリケーション領域に関する追加の知識がなければ、コードが何を行っているかを理解するのは困難です。また、多くのコンテナを値で渡すため、デバッグはかなり面倒です。

ただし、1 つの正式なエラーはかなり明らかです。関数rightfirst関数は、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

その後、インデックス値から配列をgetPathSummary反復処理しますinput0sets.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 に答える