我该如何解决“无效使用void表达式”? C ++

时间:2013-05-01 23:41:37

标签: c++ semaphore

我已经编写了一个游戏,在允许其他玩家访问之前,使用信号量将“玩家”移动到棋盘上以锁定棋盘。

为了简洁起见,我会跳过大部分代码,但这里是我搞砸的事情。

第一个是为其中一个“玩家”运行线程的函数

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 *()()'到'void (*)的无效转换(void * _'[-fpermissive] pthread_create中的第三个参数出现此问题。  我不知道这意味着什么。我尝试了很多不同的东西,但对于如何解决这个问题没有丝毫想法

2 个答案:

答案 0 :(得分:4)

pthread_create的签名是:

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

所以你传递给它的函数必须带一个void *参数,即使你没有使用它,即你的声明应该是

void* xTurn(void*) ...

答案 1 :(得分:2)

pthread_create调用的线程函数应该有一个void *参数并返回void *值。

所以,改变:

 void* xTurn()

 void* xTurn(void *)