gpt4 book ai didi

C - For循环做一个简单的操作,不增加计数器

转载 作者:太空宇宙 更新时间:2023-11-04 08:52:04 25 4
gpt4 key购买 nike

我正在编写一个播放 gem 棋的程序。这个程序包括 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 变化。复制板是在复制板功能中,但在我弄清楚为什么这不起作用之前被移动了。

有谁知道为什么会出现这个问题?我相信我已经提供了相关信息。任何帮助将不胜感激!提前致谢!

最佳答案

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];

关于C - For循环做一个简单的操作,不增加计数器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19301647/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com