2016-09-25 1 views
0

私は、互いに最も近い2つの点とそれらの間の距離を見つける分割・征服アルゴリズムを実装しようとしています。私の最終的な解決策は、(ブルートフォースを使用するのに比べて)正しい答えを見つけるが、時間の約1/3はセグメンテーションフォールトエラーを返すだろう。私はここ2、3日間この問題を修正しています。そこに印刷ステートメントを追加していますが、問題を見つけることができませんでした。もし誰かが私のコードを見たらそれを感謝します。再帰関数は時々セグメンテーションフォールトを返す

+0

デバッガはセグメンテーションフォルトをどこに配置しますか? – Cedric

+0

毎回同じ入力データまたは異なるデータを使用していますか?関数が再帰的であるとすれば、スタック領域が不足している可能性があります。スタックを増やして、プログラムをクラッシュさせるデータを再実行してみてください。 – iksemyonov

+0

@Cedricはデバッガを試したところ、 'for(j = i + 1; j Novice

答えて

2

あなたの「除算」ループは、XYの要素数が同じであることを前提としています。 Yの数字がX未満の場合、不確定な動作が発生します。これは面白い結果やクラッシュになる可能性があります。

+0

解決策を提案しますか?置き換えられるべきほんの数行、そのコメントされた置き換え(なぜ必要なのか) –

+0

意味があります。ループを2つに分割しようとしました.1つは 'Y Novice

0

ベクターのアクセス方法を変更してみてください。 Vector subscript-operatorは、少なくとも私の見解からはコンパイラ/プラットフォームによってはエラティックな動作をしているようです。 私は問題がそれがリンクリストであることから来て、メモリ内で連続していないという結果に終わったと思いますが、それは単なる推測です。(EDIT:STD ::ベクトルは、メモリ内で連続している、問題は何か他のものがある)のような、(簡単peasy autoキーワードを持つ)の代わりにイテレータを使用してみてください:これはあなたのケースのために働く

for (auto iter = Yprime.begin(); iter != Yprime.end(); iter++) { 
    // Your code here 
} 

希望を!

+0

ちょうどそれについての私の記事を編集した後、あなたのコメントを見ました。申し訳ありません。しかし、私は明示的に言った**しかし "それはちょうど推測です**"。だからあなたは私が間違っていると言って間違っている。それを試してみてください。LLVMでは添え字演算子を使ってセグメント化エラーが発生します。 – Cedric

+0

提案していただきありがとうございます。このように私のコードを再実装するのにはしばらく時間がかかりました。それでも私は同じエラーになりました... – Novice

+0

それを聞いて申し訳ありません...私は一度同様の問題を抱えていましたが、それを解決しました...そうでなければ、私が見る唯一の他の事は、 'abs(Y [i ] .x - mid.x) Cedric