【问题标题】:I got a strange error when printing a matrix and passing it to various functions打印矩阵并将其传递给各种函数时出现奇怪的错误
【发布时间】:2021-12-25 21:00:54
【问题描述】:

我收到了这个错误

*** 检测到堆栈粉碎 ***: 已终止 堕胎 (núcleo despejado) ***检测到堆栈粉碎***:终止 Abortado (núcleo despejado)

当我从第 8 行示例中选择一个值时,例如 8A 或 8C。 但是功能 play 仍然需要,但是在打印板时,它不会像应有的那样打印第 8 行。

#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;

}

【问题讨论】:

  • 这意味着您有内存溢出或其他一些内存损坏错误。使用基本的调试技术来尝试找到它。删除所有代码并一次添加一点以尝试缩小问题所在。使用valgrind 之类的工具来帮助您找到问题。
  • scanf 工作得很好,我在出现问题之前对其进行了测试,当从第 8 行中选择一个值并将其传递给函数播放时,它只是打印少一行的板子

标签: c matrix


【解决方案1】:

函数change_board 具有无限循环并覆盖板边界之外的板单元,导致未定义的行为,在您的情况下会破坏堆栈内存。

逻辑不正确。您应该测试边界情况,以便 delta_line+linedelta_col+colcount_flips_dir 中也保持在适当的范围 [0..7] 内。

【讨论】:

  • 感谢您的帮助,我通过将循环放入 2 if 控制 delta_line 和 delta_col 的部分来解决它
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-23
  • 2020-10-08
  • 2019-10-24
  • 1970-01-01
  • 2021-06-11
  • 1970-01-01
  • 2015-06-12
相关资源
最近更新 更多