私はチェスエンジンを書いており、擬似ランダムな動きを得るために、私は移動生成関数を満たすために配列を渡します。最初の行は、単にいくつかの入力チェックです...ローカル変数構造体はスコープを離れるときにリセットされないのはなぜですか?
else if(pstrcmp(input, (char*)"check", 5)){
int checkIndex = getIndex(input[6], input[7] - 49);
printf("checkindex %i\n", checkIndex);
if(!(checkIndex < 0 || checkIndex > 127)){
//we've received a valid check
struct m mUn[MOVE_BUFF];
gen_psm(checkIndex, mUn);
int i = 0;
while(mUn[i].start != mUn[i].end && i < MOVE_BUFF){
printf("%s\n", GSQ(mUn[i].end));
i++;
}
}
}
...
:ここではいくつかのコードがあります。コードの肉はstruct m mUn[MOVE_BUFF]
とwhileループの間にあります。そこで私は作成したstruct m
配列を作成し、特定の移動を指定するいくつかのintを保持してから、チェックする正方形のインデックスと塗りつぶす配列をとるgen_psm
に渡します。インデックスにあるピースの有効な移動で配列を塗りつぶします。ファインとダンディーは、最初の動きのために。その後、私は2番目の動きを試してみます。私はそれが宣言されたmUnのスコープをずっと終了していますが、配列にはまだ最初の動きからデータが入っていることがわかります。データを保持するのは構造体の性質なのでしょうか?全体を0で埋める必要がありますか(試してみると0に満ちているようです)。 0を記入する必要がある場合は、より速い方法がありますか(0を数十億回入力しなければならない場合、それは問題です)。
「C」または「C++」のいずれかを指定してください。私は関数呼び出しに基づいて 'C'と仮定し、文字列リテラルを' char * 'としてキャストしています。 – Joe
[ローカル変数のメモリはそのスコープの外にアクセスできますか?](http://stackoverflow.com/questions/6441218/can-a-local-variables-memory-be-accessed-outside-its-scope) – fredoverflow
おそらく、動きのあるグローバル/静的配列を使用し、スタックとして使用することが最善の方法です。サイズを固定(約60 * 2 * 30)し、アウトオブバウンドをチェックするためにいくつかのアサートを入れます。 – wildplasser