Ошибка сегментации при передаче двухмерного массива нескольким потокам - PullRequest
0 голосов
/ 20 апреля 2020

Я программирую на c.

Функцией моего кода является проверка программы ti c ta c toe. По сути, я использую 2d 3x3 игровую доску и передаю ее нескольким потокам, чтобы проверить победителя.

Я дошел до того, что каждая строка, столбец и диагональ используют pthread для проверки X или O на победителя. (Просто сюда включены строки для удобства, но есть и 5 других потоков). Однако я продолжаю сталкиваться с ошибкой сегментации.

Я пытался использовать указатели вместо ссылки на игровую доску и другие онлайн-решения, но пока мне не повезло.

Запуск программы с использованием g cc -pthread tictactoe. c

Может действительно использовать некоторую помощь. Я студент, и я действительно изо всех сил .. Спасибо

(Также, пожалуйста, не копайтесь в моем интервале, копирование из разных систем испортило все это)

#include<stdio.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>
//#include <sys/types.h>
#include <unistd.h>
#define BUFFSIZE 5

void *Row1(char game[3][3]){//checks row1
    if(game[0][0]=='X'&&game[0][1]=='X'&&game[0][2]=='X'){//first row
         printf("Player X is the winner!");
         exit(0);
}
else if(game[0][0]=='O'&&game[0][1]=='O'&&game[0][2]=='O'){//first row
     printf("Player O is the winner!");
     exit(0);

}
return 0;
}//end of row1 function

void *Row2(char game[3][3]){//checks row2
    if(game[1][0]=='X'&&game[1][1]=='X'&&game[1][2]=='X'){//second row
         printf("Player X is the winner!");
        exit(0);
}
else if(game[1][0]=='O'&&game[1][1]=='O'&&game[1][2]=='0'){//second row
      printf("Player 0 is the winner!");
      exit(0);
}
return 0;
}//end of row2 function

void *Row3(char game[3][3]){//checks row3
    if(game[2][0]=='X'&&game[2][1]=='X'&&game[2][2]=='X'){//third row
         printf("Player X is the winner!");
         exit(0);
}
else if(game[2][0]=='O'&&game[2][1]=='0'&&game[2][2]=='O'){//third row
    printf("Player 0 is the winner!");
    exit(0);
}
return 0;
}//end of row3 function

 int main ()
{

//creating 2d array for game
char game[3][3];
int row=0;
int col=0;
char buff[BUFFSIZE];


FILE* fptr; //creating the file to be used

if ((fptr = fopen ("//home//dominique//tictacfile.txt", "r")) == NULL)

    {
//lets me know if there's an error      
printf ("Error opening file..");

exit (0);


}

for(row=0; row<3; row++){
     fgets(buff, BUFFSIZE, fptr);
     for(col=0; col<3; col++){
          game[row][col]=buff[col];
      }
}


for(row=0;row<3;row++) {
     for (col=0;col<3;col++){
     printf("game[%d][%d] = %c\n" , row , col, game[row][col]);// using this to check for correct input
     }
col=0;
}




int err;
pthread_t row1, row2, row3, col1, col2, col3, diag1, diag2; //initalizing pthread

//row1 checker
        err = pthread_create(&(row1), NULL, Row1(game), NULL);
        if (err != 0)
            printf("\ncan't create thread :[%s]", strerror(err));
//row2 checker
       err = pthread_create(&(row2), NULL, Row2(game), NULL);
        if (err != 0)
            printf("\ncan't create thread :[%s]", strerror(err));
//row3 checker
err = pthread_create(&(row3), NULL, Row3(game), NULL);
        if (err != 0)
            printf("\ncan't create thread :[%s]", strerror(err));


}
...