Reputation: 41
I got this error
*** stack smashing detected ***: terminated Abortado (núcleo despejado) *** stack smashing detected ***: terminated Abortado (núcleo despejado)
when i choose a value from line 8 example like 8A or 8C. but the function play still makes what need but when the board is printed it doesn't print line 8 like it should.
#include <stdio.h>
#include <string.h>
//void init_board(char board[8][8]){
// for(int i=0;i<8;i++){
// board[i][j]='.';
// }
// }
// board[3][3]='o';
// board[4][4]='o';
// board[3][4]='x';
// board[4][3]='x';
//}
void init_board(char board[8][8]){
for(int i=0;i<8;i++){
for(int j=0;j<8;j++){
board[i][j]='.';
}
}
board[3][3]='o';
board[4][4]='o';
board[3][4]='x';
board[4][3]='x';
board[5][2]='x';
board[5][3]='o';
board[6][1]='x';
board[3][0]='o';
board[3][1]='o';
board[4][1]='x';
board[2][5]='o';
board[2][4]='x';
}
void print_board(char board[8][8]){
printf(" A B C D E F G H");
for(int i=0;i<8;i++){
printf("\n");
printf("%d ",i+1);
for(int j=0;j<8;j++){
printf("%c ",board[i][j]);
}
}
}
int count_flips_dir(char board[8][8],int line, char col,int delta_line,int delta_col,char color){
int i;
if(board[line+delta_line][col+delta_col]=='.'){
return 0;
}
for(i=0;board[line+delta_line][col+delta_col]!=color;i++){
line=line+delta_line;
col=col+delta_col;
if(board[line+delta_line][col+delta_col]=='.'){
return 0;
}
}
return i;
}
int flanked(char board[8][8],int line,char col,char color ){
int NN = count_flips_dir(board,line,col,-1,0,color);
int ND = count_flips_dir(board,line,col,-1,1,color);
int NE = count_flips_dir(board,line,col,-1,-1,color);
int SS = count_flips_dir(board,line,col,1,0,color);
int SD = count_flips_dir(board,line,col,1,1,color);
int SE = count_flips_dir(board,line,col,1,-1,color);
int D = count_flips_dir(board,line,col,0,1,color);
int E = count_flips_dir(board,line,col,0,-1,color);
return NN+NE+ND+SD+SE+SS+E+D;
}
void changeboard(char board[8][8],int line, char col,int delta_line,int delta_col,char color){
int i;
for(i=0;board[line+delta_line][col+delta_col]!=color;i++){
board[delta_line+line][delta_col+col]=color;
line=line+delta_line;
col=col+delta_col;
}
}
void change(char board[8][8],int line,char col,char color){
if (count_flips_dir(board,line,col,-1,0,color)>0){
changeboard(board,line,col,-1,0,color);
}
if (count_flips_dir(board,line,col,-1,1,color)>0){
changeboard(board,line,col,-1,1,color);
}
if (count_flips_dir(board,line,col,-1,-1,color)>0){
changeboard(board,line,col,-1,-1,color);
}
if (count_flips_dir(board,line,col,1,0,color)>0){
changeboard(board,line,col,1,0,color);
}
if (count_flips_dir(board,line,col,1,-1,color)>0){
changeboard(board,line,col,1,-1,color);
}
if (count_flips_dir(board,line,col,1,1,color)>0){
changeboard(board,line,col,1,1,color);
}
if (count_flips_dir(board,line,col,0,1,color)>0){
changeboard(board,line,col,0,1,color);
}
if (count_flips_dir(board,line,col,0,-1,color)>0){
changeboard(board,line,col,0,-1,color);
}
}
void play(char board[8][8],int line,char col,char color){
board[line][col]=color;
change(board,line,col,color);
print_board(board);
}
int main(){
int l;
char c;
char board[8][8];
init_board(board);
print_board(board);
printf("\nEscolha a sua Jogada: ");
scanf("%d %c", &l, &c);
c=c-'A';
l=l-1;
//teste função count_flips_dir
//printf("%d",count_flips_dir(board,l,c,1,1,'o'));
//teste funçao flanked
//printf("\n%d",flanked(board,l,c,'o'));
if (board[l][c]=='.'){
if(flanked(board,l,c,'o')>0){
play(board,l,c,'o');
}
}
return 0;
}
Upvotes: 0
Views: 33
Reputation: 144780
The function change_board
has an infinite loop and overwrites board cells beyond the board boundaries, causing undefined behavior, in your case corrupting stack memory.
The logic is incorrect. You should test boundary cases so delta_line+line
and delta_col+col
stay in the proper range [0..7] in count_flips_dir
too.
Upvotes: 1