• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:Greedy Searchのプログラムについて)

Greedy Searchのプログラムについて

このQ&Aのポイント
  • Greedy SearchについてのプログラムをLinuxで実行しているが、セグメントエラーが発生する。
  • 配列数を増やしても結果は変わらず、原因が分からない。
  • ヒントやアドバイスをいただけると助かります。

質問者が選んだベストアンサー

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.3

C言語は ・基本的に書いてある順番に実行されます。 ・初期化していない変数には何が入っているか不定です。 ・配列の添字が宣言の範囲内かどうかのチェックはしません。 等の特徴があります。 > ma[k],na[k]=0; > min[k] = DBL_MAX; > k=0; 数学ではよく見かける表現ですが、プログラムとしては問題です。 この「k=0」以前にkの値を設定している箇所がありません。そのため、これ以前のkには何が入っているか不定です。 -7かもしれないし573474かもしれない。 記述した順番に実行されるので、「ma[k],na[k]=0;」「min[k] = DBL_MAX;」のkはその不定な値がそのまま使われます。上の-7だった場合は「ma[-7],na[-7]=0;」「min[-7] = DBL_MAX;」です。 ここで「配列の範囲外」とエラーになればまだわかりやすいのですが、Cではそのチェックをしません。なにくわぬ顔で実行しようとします。そしてたまたま動作してしまうこともありますが、大抵はSegmentation Faultが発生します。 > check[m][n]=0; も同様。この時点でmもnも値が入っていません。 それから、 > ma[k],na[k]=0; ですが、C言語には「カンマ演算子」というのがあります。これは、カンマで区切られた式を順番に評価する(そして、最後に評価した値を返す)というものです。上の式は ・ma[k] を評価 ・na[k] =0 を評価(して、式の値である0を返す) となります。 ma[k]=0の意味はありません。 > do{ > k++; ここでも、場合によっては k>=100となる可能性があります。na[k],ma[k],min[k]の範囲外です。自前でエラーチェックするべきです。 /* もっとも、中を見ると、直前の値を使うだけですから、添字を工夫すれば na[2],ma[2],min[2] で十分です。 */ 思ったのですが na[k]=0 check[m][n]=0 って na[k]=0 (すべてのkについて) check[m][n]=0(すべての m,nについて) の意味でつかってませんか?だとしたら、Cにはそんな機能はありません。ループを使って一つずつ代入してください。

hatouiru
質問者

お礼

自己解決できました。回答ありがとうございました。

その他の回答 (3)

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.4

あと、既に指摘のある#defineですが > #define SRC_X_SIZE 352 入力画像縦サイズ  「他から持ってきた」とありますが、そのファイルでもこうなっているのですか? それとも、ここに書いたときにコメントを付けたしたのですか? 前者なら「352 入力画像縦サイズ」がSRC_X_SIZEマクロの値になります。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

「#includeの部分から25行下の部分」? #include から 25行下は「/*探索範囲*/」の次の for (n = -SW_SIZE + 6 + na[k]; n <= SW_SIZE - 6 + na[k]; n += 1) だけど, ここで k を初期化してる? for (x = 0, xx = 0; x < SRC_X_SIZE; x += MB_SIZE, xx++) { の次の行, ma[k],na[k]=0; の時点では k は初期化されてないよね. あと, この文で ma[k] って何か意味あるの?

hatouiru
質問者

補足

ma[k],na[k]=0; の次の次の行でk=0;としました。 もしかしたらそれ以前にkを初期化しないといけないのでしょうか・・・? ma[k],na[k]は一回の探索ごとに、探索範囲の最小値であった部分の座標を格納し、次の探索範囲の決定のために使用しています。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

#define は変. あと, fullSearch の中で k はいつ初期化してるの? greedy search なのに「fullSearch」というのも謎だが....

hatouiru
質問者

お礼

自己解決できました。回答ありがとうございました。

hatouiru
質問者

補足

#defineですが、本文中の固有値の説明のため、他の関数部分から引っ張ってきたものです。無視してください。 また、フルサーチとなっている部分はもともとフルサーチのプログラムだったものを直したものなので、そう記述してあります。 ややこしくなってしまい、申し訳ないです。 kは一応#includeの部分から25行下の部分で初期化しているつもりです。

関連するQ&A

専門家に質問してみよう