2016-12-23 16 views
0

この種のエラーが発生することがあります。私の質問は、いつどこで(どの行)正確にこのエラーが発生するかについての情報を見つける方法はありますか?私はubuntu linux 14.04を使っています。昇華とg ++を使用します。浮動小数点例外、セグメンテーションフォールトおよび類似のエラー

ここは私の現在のコードです。私はこれで浮動小数点例外を取得します。 2つのベクトルをとり、最初のセットのすべての要素で割り切れる数を出力し、2番目のセットのすべての要素を分割できます。

このコードを投稿することは、トピックにはあまり関係ありませんが、前述のエラータイプをデバッグするための適切な方法を見つけることができなくなりました。これは私の最初の時間です。ここで質問してください。

int main() 
{ 
    vector<int> firstVector; 
vector<int> secondVector; 
firstVector = {2,4}; 
secondVector = {16,32,96}; 
auto it = firstVector.begin(); 
for (int i = 1; i <= 100; ++i) 
{ 
    it = firstVector.begin(); 
    for (; ; ++it) 
    { 
     if(i%(*it)!=0) 
      break; 
     if(it==firstVector.end()) 
     { 
      it=secondVector.begin(); 
      while(it!=secondVector.end()) 
      { 
       if((*it)%i!=0) 
       { 
        it=firstVector.begin(); 
        break; 
       } 
       it++; 
      } 
     } 
     if(it==secondVector.end()) 
      break; 
    } 
    if(it==secondVector.end()) 
     cout << i << endl; 
} 
return 0; 
} 
+5

ようこそスタックオーバーフロー!デバッガを使用してコードをステップ実行する方法を学ぶ必要があるようです。良いデバッガを使用すると、プログラムを1行ずつ実行し、どこからずれているかを確認することができます。これはプログラミングをする場合に不可欠なツールです。詳しい読書:** [小さなプログラムをデバッグする方法](http://ericlippert.com/2014/03/05/how-to-debug-small-programs/)** – NathanOliver

+0

あなたのテストデータはどこですか?そして、もしあなたがそれを持っていれば、プログラムを実行するたびに、 'cin'を使う代わりに、プログラムでデータをハードコードし、キーボードを消耗させてください。 – PaulMcKenzie

+0

なぜテストデータを使用していないのか分かりません。私はそれを必要としないと思う?また、これはコード挑戦のための解決策であり、 "cin"です。 – zeke

答えて

1

私はfirstVectorsecondVector以上の繰り返しに問題があると思います。第二のループに:

auto it = firstVector.begin(); 
for (; ; ++it) 
{ 

itfirstVectorのイテレータです。しかし、次のループで:

it=secondVector.begin(); 
while(it!=secondVector.end()) 
{ 

itsecondVectorためのイテレータになります。 it以上の反復は、ループの後に続き、このwhileループの後に続きます。 ++itを増やし、.end()要素以降の要素if(i%(*it)!=0)にアクセスします。これにより、UBになります。

この要素はプレースホルダとして機能します。アクセスしようとすると、未定義の動作が発生します。

+0

それは素晴らしい編集だった。私はあなたが言っていたことをとても理解しようとしていました。 – zeke

+0

@ yavuz650ねえ、もっとはっきりしないことを願っています。 – Nikita

+0

更新されたコードを確認してください。一番外側の "for"ループのすべての反復に対して、 "it"はfirstVector.begin()に再割り当てされます。 "it"が.end()に達したためにwhileループが終了した場合、プログラムはまた中間の "for"ループから抜け出します(39行目をチェック)。私はここに迷っている。 – zeke

0

この質問は一種の2文字です。 Nikitaは既にあなたのコードに対処して以来...

私の質問は、このエラーがいつどこで発生するのかについての情報を見つける方法はありますか?

Linuxでデバッグする場合は、gdb name-of-executableを使用してください。単純にrunとsegフォールトが発生したときにプログラムが壊れたり、致命的な例外がスローされます。ファイル名と行番号が表示されます。

さらに次のようなgdbコマンドを検索することもできます。http://www.yolinux.com/TUTORIALS/GDB-Commands.html

+1

'-O0'でコンパイルして、行番号が最適化されないようにしてください。 – Matt

関連する問題