0

私はずっと探していて、このようなものを見つけることができません。さて、私は私のプログラム全体であなたを退屈させません. 信じられないほど長いです。ただし、基本的な概要は次のとおりです。

int main()
{
  int i=0;
  int h=5;

  cout << "h(IS) = " << h << endl;

  cout << "testing comment.";

  while(i < 10)
  {
  cout << "I'm in the loop!";
  i++;
  }

  return 0;
}

素敵ですね。さて、ここで問題です。実行すると、セグメンテーション違反が発生します。最も奇妙な部分は、私がそれを手に入れているところです。そのテストコメントは印刷されません。ああ、ループの前にすべての行をコメントアウトすると、まだエラーが発生します。

だから、ここに私の出力があるので、あなたは理解しています:

h(IS) = 5
Segmentation fault

私は完全に、そして完全に困惑しています。私のプログラムでは、 h は関数を呼び出しますが、 h を出力する行と関数呼び出しの両方をコメントアウトしても効果はありません。

この障害の原因は何ですか? それがどこから来ているのかをテストするためにできることはありますか?

あなたの答えを簡単にしてください、私はここにいるほとんどの人に比べて初心者です:)

注: リクエストに応じて完全なコードを提供できますが、長さは 600 行です。

編集: ここに実際のコードを貼り付けました: http://pastebin.com/FGNbQ2Ka

いたるところにある奇妙なコメントと配列を許してください。これは学校の課題であり、ポインターではなくそれらを使用する必要があります。目標は、15 パズルの解決策を出力することです。そして、今は午前 1 時なので、この記事全体を通して、イライラしたコメントを修正するつもりはありません。

私はつい最近イライラして最初の印刷物全体をコメントアウトしました。私はまだ障害を取得します。何も印刷されていないだけです。

興味のある方のために、私の入力情報は 0 6 2 4 1 10 3 7 5 9 14 8 13 15 11 12 です

助けてくれたみんな、どうもありがとう!:)

4

3 に答える 3

5

配列の境界をすり抜けて、破損を引き起こします。

for (i=0; i<=4; i++)
{
  for (j=0; j<=4; j++)
  {
        if (cur[i][j] == 0)
        {
          row = i;
          col = j;
        }
  }
}

iおよびjインデックスが 4 に達してはなりません。

于 2013-02-23T09:03:14.700 に答える
0

57 ~ 67 行目:

for (i=0; i<=4; i++)
{
  for (j=0; j<=4; j++)
  {
    if (cur[i][j] == 0)
        {
          row = i;
          col = j;
        }
  }
}

エラーの少なくとも 1 つがこのコードにあります。cur は int cur[4][4] と宣言されています。これは、j==4 の場合 (および i==4 の場合)、配列の境界内にないことを意味します (すべてではなく一部のメモリ内にいます) 有効な値は 0 - 3 になります。

于 2013-02-23T09:08:35.390 に答える
0

valgrindは、メモリ アクセスの問題をデバッグするための優れたツールです。Linux での使用は非常に簡単です。G++ と valgrind をインストールしてから ($記号なしで)実行します。

$ g++ -g -o prog prog.cpp
$ valgrind ./prog

ソースコードの行番号とともに、メモリアクセスの問題に関する非常に詳細なエラーメッセージを出力します。それでも意味がわからない場合は、完全なソース コード (prog.cpp) と valgrind の完全な出力を投稿してください。

valgrind を実行しました。出力は次のとおりです: http://pastebin.com/J13dSCjw

初期化しない値を使用しているようです:

==21408== Conditional jump or move depends on uninitialised value(s)
==21408==    at 0x8048E9E: main (prog.cpp:61)
...
==21408== Conditional jump or move depends on uninitialised value(s)
==21408==    at 0x804A809: zero(int (*) [4], int (*) [4], int*, int, int, int, int, int, int) (prog.cpp:410)
==21408==    by 0x804A609: lowest(int (*) [4], int (*) [4], int, int, int, int, int, int) (prog.cpp:354)
==21408==    by 0x804932C: main (prog.cpp:125)
...

これらの問題を修正するには、上記のエラー行 (61 行目、410 行目など) に示されている変数を初期化するコードを追加し、再コンパイルして、すべてのエラーが消えるまで valgrind で再実行します。

valgrind によって報告されたすべての問題を修正した後でも、プログラムの動作がおかしくなる場合は、お知らせください。

于 2013-02-23T08:55:34.647 に答える