2016-05-30 2 views
-1

私はベクトルcpatchesを空ではなく、少なくとも1つのオブジェクトcv::Point3i(0,0,0)を含んでいます。以下は、セグメント化エラーを与える私のコードです。コードは、r2 = objects.front().yに達するまで完全に正常に動作し、セグメント化エラーが発生し、コードが中止されます。C++でのベクトルのセグメンテーションエラー

cv::Point3i(0,0,0)で区切られたオブジェクトをobjectsという別のベクターに分離しようとしています。並べ替えでは、compare_rowcompare_colが問題なく動作します。 (それぞれa.y > b.ya.z > b.zを返します)

コードは以下のとおりです。

for (int i = 0; i < cpatches.size(); i++) { 
    cv::Point3i npoint = cpatches[i]; 
    std::vector<cv::Point3i> objects; 
    std::cout << npoint << std::endl; 
    if (npoint.x != 1 && npoint.y != 1 && npoint.z != 1) { 
     objects.push_back(npoint); 
    } else { 
     std::sort(objects.begin(), objects.end(), compare_row); 
     int r1, r2, c1, c2; 
     r2 = objects.front().y; 
     r1 = objects.back().y; 
     std::sort(objects.begin(), objects.end(), compare_col); 
     c2 = objects.front().y; 
     c1 = objects.back().y; 
     cv::rectangle(display_obstacles, cv::Point(r1, c1), cv::Point(r2, c2), CV_RGB(0, 255, 0)); 
     std::cout << "hhh" << r1 << ", " << c1 << "; " << r2 << ", " << c2 << "; "; 
     objects.clear(); 
    } 
} 

ベクターの最初の要素と最後の要素を呼び出すときにどのようなエラーが発生したのか確認できますか?

+0

} else { 

:これを防止する一つの簡単な方法は、行を変更することです'オブジェクト '。 – BeyelerStudios

+0

'cpatches'の最初の' npoint'がelse分岐する場合はどうなりますか? 'objects'は空になり、' objects.front() 'ではsegfaultになります。 – mirt

答えて

1

vectorインスタンスが空の場合は、front()またはback()メソッド(いずれも少なくとも1つの要素の存在を前提としています)のいずれかが未定義の動作です。これはあなたの問題を引き起こしていることはほぼ確実です。

このシナリオでは、すべての要素がobjectsにプッシュされる前にelse句を入力します。 `npoint`次いでないオブジェクトがでありません '、X、Y、z`いずれかに' 1 'を有する場合

} else if (!objects.empty()) { 
+0

しかし、なぜオブジェクトベクトルが空になるのですか?オブジェクトがobject.push_back(npoint)を使って追加された場合でも、ベクトルは空ですか?あなたは私にそれを説明できますか? – Hasi

+0

私はそれを得ました::ベクトルオブジェクト; forループの外側で定義する必要があります。さもなければ、常にベクトルの新しいインスタンスを作成します。これにより、すべてのiに対して空のベクトルになります。 – Hasi

関連する問題