2013-05-01 57 views
0

我已經寫了一個遊戲來移動棋盤周圍的棋手使用信號量鎖定棋盤,然後再允許其他玩家進入。我該如何解決「void表達式的無效使用」? C++

爲了簡潔起見,我將跳過大部分代碼,但這裏是我弄糟的事情。

首先是運行線程的「玩家」

void* xTurn(){ 
int move; //generate random number to place items on board 
move = rand()%4+1; 
//generates a number between 1 and 4 
while(tokens!=0){ //while there are still "tokens" on the board, continue 
    sem_wait(&sB); 
    for(int i = 0; i < ROW; i++){ 
     for(int j = 0; j < COL; j++){ 
      if(board[i][j] == 'X'){ 
       switch(move){ 
        case '1': 
         if(i++>8){ 
          xTurn(); 
         } 
         else{ 
          if(board[i++][j]=='a'){ 
           xScore++; 
           tokens--; 
          } 
          if(board[i++][j]=='A'){ 
          xScore+2; 
          tokens--; 
          } 
         board[i][j]='-'; 
         board[i++][j]='X'; 
         break; 
         } 
        case '2': 
         if(i--<0){ 
          xTurn(); 
         } 
         else{ 
          if(board[i--][j]=='a'){ 
           xScore++; 
           tokens--; 
          } 
          if(board[i--][j]=='A'){ 
           xScore+2; 
           tokens--; 
          } 
         board[i][j]='-'; 
         board[i--][j]='X'; 
         break; 
         } 
        case '3': 
         if(j++>8){ 
          xTurn(); 
         } 
         else{ 
          if(board[i][j++]=='a'){ 
           xScore++; 
           tokens--; 
          } 
          if(board[i][j++]=='A'){ 
           xScore+2; 
           tokens--; 
          } 
         board[i][j]='-'; 
         board[i][j++]='X'; 
         break; 
         } 
        case '4': 
         if(j--<0){ 
          xTurn(); 
         } 
         else{ 
          if(board[i][j--]=='a'){ 
           xScore++; 
           tokens--; 
          } 
          if(board[i][j--]=='A'){ 
           xScore+2; 
           tokens--; 
          } 
         board[i][j]='-'; 
         board[i][j--]='X'; 
         break; 
        } 
       } 
      } 
     } 
    } 
} 
sem_post(&sB); 
} 

而且我在這裏稱之爲一個函數。假設我有方法yTurn和zTurn;打印以類似的方式進行。

void playgame(){ 
createBoard(); 
srand (time(NULL)); 

sem_init(&sB,0,0); 
pthread_create(&tX,NULL,&xTurn,NULL); 
pthread_create(&tY,NULL,&yTurn,NULL); 
pthread_create(&tZ,NULL,&zTurn,NULL); 
pthread_create(&tP,NULL,&print,NULL); 
pthread_join(tX,NULL); 
pthread_join(tY,NULL); 
pthread_join(tZ,NULL); 
pthread_join(tP,NULL); 


if(xScore>yScore&&zScore){ 
cout<<"Player X Wins with a score of "<<xScore; 
} 
if(yScore>xScore&&zScore){ 
cout<<"Player Y Wins with a score of "<<yScore; 
} 
if(zScore>yScore&&xScore){ 
cout<<"Player Z Wins with a score of "<<zScore; 
} 
sleep(20); 
menu(); 
} 

當我運行它,我得到兩個不同的錯誤:

一個,告訴我睡不申報,但運行Linux時,它會得到解決。 (*)(void * _'[-fpermissive] 這個問題發生在pthread_create的第三個參數中。 我還沒有 - 從void *()()'無效轉換到'void 。一個線索,這是什麼意思我已經嘗試了一些不同的東西,但沒有絲毫的想法,如何解決這一問題

+0

沒有這裏涉及到的信號量。可能要刪除該標籤,並可能添加pthread。 – Joel 2013-05-01 23:52:32

回答

4

在pthread_create的簽名是:

int pthread_create(pthread_t *thread, const pthread_attr_t *attr, 
         void *(*start_routine) (void *), void *arg); 

所以你傳遞給它的函數必須帶一個void *參數,即使你不使用它,也就是說你的聲明應該是

void* xTurn(void*) ... 
+0

是的,我早些時候嘗試過,和xTurn();我後來在代碼中使用了這個代碼,擺脫了括號,並且扔在了前面。現在就工作,謝謝。希望沒有別的東西彈出來。 – drpogue 2013-05-01 23:55:44

2

調用pthread_create的線程函數應該有一個void *參數並返回void *值。

所以,變化:

void* xTurn() 

void* xTurn(void *) 
相關問題