0

Mancala を再生するプログラムを書いています。このプログラムには GTK と 2 つのスレッドが含まれています。この 2 つのいずれにも問題があるとは思いません。

基本的に何が起こっているかというと、次のデータ構造の配列があります。

typedef struct puds{
    int x;
    int y;
    int count;
    int flag;}PUDPOINT;

簡単に言えば、x 座標と y 座標、石の数、そしてコンピューターまたはユーザーのフラグ (0 または 1) です。

次の行を使用してスレッドを作成します。

pthread_mutex_init(&mut, 0);
pthread_create(&thid, 0, (void *) movecomputer, win);

この機能を実行するもの:

void *movecomputer(GtkWidget *win){

        int tmp;
        int flagcopy;
        int rndmove;
        for(;;){
                sleep(2);

                pthread_mutex_lock(&mut);
                flagcopy = thread_flag;
                pthread_mutex_unlock(&mut);

                if(flagcopy == COMP_MOVE){
                        sleep(1);
                        printf("Its comp's move\n");
                        /* Here is where the AI logic goes */
                        look_for_comp_move();

                        pthread_mutex_lock(&mut);
                        thread_flag = USER_MOVE;
                        pthread_mutex_unlock(&mut);
                }
                else{
                        printf("Its user's move\n");
                }
        }
}

void look_for_comp_move(){

        PUDPOINT fauxpuddles[TOTAL_HOLES];
        int i, k;

        fprintf(stderr, "THERE SOME STUFF GOIN DOWN\n");
        /* For indexes 8-13 */
        for(i = 8; i <= TOTAL_HOLES; i++){
                /* If there are stones to move, copy the board*/
                if(puddles[i].count){
                        for(k = 0; k <= TOTAL_HOLES; k++){
                                fauxpuddles[k].x = fauxpuddles[k].x; // Don't care about X or Y
                                fauxpuddles[k].y = fauxpuddles[k].y;
                                fauxpuddles[k].count = puddles[k].count;
                                fauxpuddles[k].flag = puddles[k].flag;
                        }
                        //copyboard(fauxpuddles);
                }
                fprintf(stderr, "i:%d\n", i);
        }
        return;
}

渦巻いて無限ループに陥ります。最も内側の (k) ループでステートメントを試行した後fprintf、k が 5 から 12 だけになるように見えます。ボードのコピーはコピーボード機能にありましたが、これが機能しない理由がわかるまで上に移動しました。

この問題が発生している理由を知っている人はいますか? 私は関連する情報を提供したと信じています。どんな助けでも大歓迎です!前もって感謝します!

4

1 に答える 1

2

C 配列はゼロベースなので、有効なインデックス

PUDPOINT fauxpuddles[TOTAL_HOLES];

[0..TOTAL_HOLES-1] です。あなたのループ

for(k = 0; k <= TOTAL_HOLES; k++){

これを通り過ぎます。k==TOTAL_HOLESによって割り当てられたメモリの最後を超えて書き込むときの最後の反復fauxpuddles。これを行うことの効果は未定義ですが、ループカウンターの1つを使用してメモリに書き込んでいるように聞こえます-iおよびk.

修正は簡単です。ループの繰り返しを 1 回少なくするかのいずれかです。

for(k = 0; k < TOTAL_HOLES; k++){

または余分な要素を追加しますfauxpuddles

PUDPOINT fauxpuddles[TOTAL_HOLES+1];
于 2013-10-10T16:51:45.870 に答える