0

我正在编写一个可以播放 Mancala 的程序。这个程序包括 GTK 和两个线程——我不相信这两个都是问题。

基本上发生的事情是我有一个这个数据结构的数组:

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。这样做的效果是不确定的,但听起来你正在使用循环计数器之一写入内存 -ik.

修复很简单,要么少执行一次循环迭代

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

或添加一个额外的元素fauxpuddles

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