我正在编写一个可以玩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。复制电路板是在电子白板功能,但向上移动,直到我可以找出为什么这不起作用。
有谁知道为什么会出现这个问题?我相信我已经提供了相关信息。任何帮助将不胜感激!提前致谢!
答案 0 :(得分:2)
C数组从零开始,因此
的有效索引PUDPOINT fauxpuddles[TOTAL_HOLES];
是[0..TOTAL_HOLES-1]。你的循环
for(k = 0; k <= TOTAL_HOLES; k++){
跑过这个。最后一次迭代,当k==TOTAL_HOLES
写入超出fauxpuddles
分配的内存结束时。这样做的效果是未定义的,但听起来你正在使用其中一个循环计数器写入内存 - i
和k
。
修复很简单,要么少执行一次循环迭代
for(k = 0; k < TOTAL_HOLES; k++){
或向fauxpuddles
PUDPOINT fauxpuddles[TOTAL_HOLES+1];