2011-10-29 2 views
1

のために内部立ち往生だからここに私のコードCがループ

int find_h(int i, int j, int current[N+1][N], int goal[N+1][N]) 
{ 
    int sum=0; 
    int a, b; 
    int cp[N*3], gp[N*3]; 
    for(a=0;a<N;a++) 
    { 
    for(b=0;b<N;b++) 
    { 
     cp[4*a+b]=current[a][b]; 
     gp[4*a+b]=goal[a][b]; 
     printf("b = %d\n", b); 
    } 
    printf("\n"); 
    } 
    return sum; 
} 

N = 4と現在と目標はそれぞれ一度だけ表示されて、0から15包括的に数字で満たされています。

最初の3回の繰り返し(a = 3まで)はループしますが、b = 0は永遠に出力され続けます。

おかげ

+0

cpとgpは何に使用されていますか?合計は決して計算されないようです –

答えて

1

私はあなたが何をしたいのか分からないが、私はあなたに何かを教えてあげましょう:cpgpはあまりにも小さいです。書かれているように、彼らは(== 12)の代わりに大きいN * Nでなければなりません。

ここではcp[4*a+b]と書いてあります。N*a+bです。 N == 4なら、それは同じです。そうでない場合...

そして、それは明らかではありません:int current[N+1][N]これは(N == 4)20配列要素になります。 N * N要素(またはおそらくN * 3、上記を参照)の線形化された配列にコピーしています。

+0

ああ!ありがとう! – Kamran224

+1

これが無限ループに変わった理由を明らかにするには、 'cp [13]'または 'gp [13]'が実際に 'b'を指している可能性があります(なぜなら、そのメモリの直後に起こった)、 'current [3] [1]'または 'goal [3] [1]'が '0 'だったので、' b'を '0' - 明らかな方法。間違いなく定義されていない動作。 –

2

あなたのループはメモリを上書きしていると思います。 N = 4の場合、cp [12]とgp [12]を割り当てます。しかし、a = 3 cp [4 * a + b]とgp [4 * a + b]の両方が配列の終わりを過ぎて[12]である場合

1

cpgpは小さすぎます。インデックスが4*(N-1)+(N-1)の要素に割り当てていますが、配列の長さは3*Nです。

配列の最後を超えて書き込むと、プログラムの動作は未定義です。

0

cpバッファとgpバッファがあふれているようです。 3 * Nではなく、4 * Nスペースを割り当てる必要があります。それを変更しよう私は、私は自分のコンピュータから離れています。