1

私は次の構造体を持っています:

struct FeatureMatch {
    int id1, id2;
    double score; 
};

この関数によって呼び出されたときに正常に実行されます。

void ssdMatchFeatures(const FeatureSet &f1, const FeatureSet &f2, vector<FeatureMatch> &matches, double &totalScore) {
    int m = f1.size();
    int n = f2.size();
    matches.resize(15000);
    totalScore = 0;

    double d;
    double dBest;
    int idBest;
   printf("2");
    for (int i=0; i<m; i++) {
        dBest = 1e100;
        idBest = 0;

        for (int j=0; j<n; j++) {
            d = distanceSSD(f1[i].data, f2[j].data);

            if (d < dBest) {
        dBest = d;
        idBest = f2[j].id;
            }
        }
        printf("1\n");
        matches[i].id1 = f1[i].id;
        matches[i].id2 = idBest;
        matches[i].score = -dBest;
     //   matches[i].second=1;
        totalScore += matches[i].score;
    }

    printf("3");
}

ただし、新しい要素を追加して構造体を変更するとすぐに:

struct FeatureMatch {
    int id1, id2;
    double score, second; 
};

second と呼ばれる追加の double 値により、セグメンテーション エラーで上記の関数がクラッシュします。1,2,3 の出力は次のようになります。

21 1 1 1 1 . . . 1

しかし、クラッシュする前に 3 に到達することはありません。

ここで何が起こっているのですか?match[i].second をまったく変更しない場合でも、これは発生します。

4

1 に答える 1

1

構造体の定義を変更した場合、ビルドツールで自動的に変更されない場合は、影響を受けるすべてのソースファイルを再構築する必要があります。そうしないと、構造に異なる定義を使用するモジュールをリンクする可能性があり、その結果、(これまで見てきたように)混乱を招くバグが発生します。

于 2012-09-21T04:37:42.227 に答える