无法从矩阵打印

  • 本文关键字:打印 c++
  • 更新时间 :
  • 英文 :


试图制作一款tictactoe游戏,我通常是编程新手,在控制台上打印游戏地图时不断获得SIGBUS

void draw(MATRIX m){/**
*  x | o | x            
____|___|_____              
*    | o |                
____|___|_____                
|   |     
| o |                       
*/
char inttox[3];
inttox[0]=' ';inttox[1]='x';inttox[2]='o';
printf("  %c | %c | %c   n____|___|_____n  %c | %c | %c   n____|___|_____n    |   |     n  %c | %c | %c   n",
inttox[m.im[0][2]],inttox[m.im[1][2]],inttox[m.im[2][2]]
,inttox[m.im[0][1]],inttox[m.im[1][1]],inttox[m.im[2][1]]
,inttox[m.im[0][0]],inttox[m.im[1][0]],inttox[m.im[2][0]]);
}

当我运行gdb时,我得到

Player 1's turn: 1 0
Program received signal SIGBUS, Bus error.
0x000055555555528b in draw (m=...) at galo.c:39
39      ,inttox[m.im[0][0]],inttox[m.im[1][0]],inttox[m.im[2][0]]);

inttox是一个有3个位置的向量,索引是玩家输入的,从0到没有人在这里玩,从1/2到各自的玩家在这里玩。

m是包含向量的矩阵,因为我发现它比处理如何正确实现字符串矩阵更容易理解。

完整的代码在这里:

#include<stdio.h>
typedef struct {
int im[3][3];
}MATRIX;
int logic(int p, MATRIX m){
if(
(m.im[0][0])==(m.im[1][1])==(m.im[2][2])||//diagonals
(m.im[0][2])==(m.im[1][1])==(m.im[2][0])||
(m.im[0][0])==(m.im[0][1])==(m.im[0][2])||//columns
(m.im[1][0])==(m.im[1][1])==(m.im[1][2])||
(m.im[2][0])==(m.im[2][1])==(m.im[2][2])||
(m.im[0][0])==(m.im[1][0])==(m.im[2][0])||//lines
(m.im[0][1])==(m.im[1][1])==(m.im[2][1])||
(m.im[0][2])==(m.im[1][2])==(m.im[2][2])){
return 1;
}

p++;
if(p>2)p=1;
return 0;
}
void draw(MATRIX m){/**
*  x | o | x            
____|___|_____              
*    | o |                
____|___|_____                
|   |     
| o |                       
*/
char inttox[3];
inttox[0]=' ';inttox[1]='x';inttox[2]='o';
printf("  %c | %c | %c   n____|___|_____n  %c | %c | %c   n____|___|_____n    |   |     n  %c | %c | %c   n",
inttox[m.im[0][2]],inttox[m.im[1][2]],inttox[m.im[2][2]]
,inttox[m.im[0][1]],inttox[m.im[1][1]],inttox[m.im[2][1]]
,inttox[m.im[0][0]],inttox[m.im[1][0]],inttox[m.im[2][0]]);
}
MATRIX input(int p,MATRIX m){
if(p>2||p<1){
printf("###player invalid###");
}
int a,b;
printf("Player %d's turn: ",p);
scanf("%d %d", &a, &b);
if(a>2||b>2){
printf("Insert a correct position (0-2, 0-2)");
return input(p,m);
}
m.im[a][b]=p;
return m;
}
int main(){
MATRIX matriz;
for (int i = 0; i < 2; i++)
{
for (int j = 0; j < 2; j++)
{
matriz.im[i][j]=0;
}
}
int p=1;
draw(matriz);
matriz=input(p,matriz);
logic(p,matriz);
}

您有3个位置,但您在这里只初始化了2个位置:

for (int i = 0; i < 2; i++)
{
for (int j = 0; j < 2; j++)
{
matriz.im[i][j]=0;
}
}

变量matriz被声明为非静态局部变量,因此其值在初始化之前是不确定的。

初始化这样的所有元素以修复:

for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 3; j++)
{
matriz.im[i][j]=0;
}
}

最新更新