2013-10-10 60 views
0

我正在寫一個將玩Mancala的程序。這個程序包括GTK和兩個線程 - 我不相信這兩個都是問題。C - For循環做一個簡單的操作,不會增加計數器

基本上正在發生的事情是我有這種數據結構的數組:

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

什麼是'TOTAL_HOLES'的價值? – BlackVegetable

+0

13,對不起 - 忘了提。 –

回答

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

謝謝。我有極端的隧道視覺,並確定它必須與線程相關。這是我使用線程的第一個程序,我之前使用過很多循環,但從未意識到這一點。謝謝! –