当我在windows (CodeBlocks)上运行代码时,一切正常,但当我在Linux上运行时,它说检测到堆栈粉碎并且不打印除板以外的任何内容;代码如下:
#include <stdio.h>
#include <stdlib.h>
void inimatri(char mat[7][7]){
int l=0,c=0;
while (l<8){
while (c<8){
mat[l][c]='.';
c=c+1;
}
c=0;
l=l+1;
}
mat[3][3]='O';
mat[3][4]='X';
mat[4][3]='X';
mat[4][4]='O';
mat[2][5]='O';
mat[5][2]='O';
mat[3][2]='O';
mat[5][4]='O';
}
void showmat (char mat[7][7]){
int l=0,c=0;
printf(" 0 1 2 3 4 5 6 7");
while (l<8){
printf( "n%d",l);
while (c<8){
printf( " %c",mat[l][c]);
c=c+1;
}
c=0;
l=l+1;
}
}
int hord(char mat[7][7], int l, int c, char pecaac){
int legal;
if (c== 7){
return 0;
}
if (mat[l][c]!='.'){
return 0;
}
if (mat[l][c+1]==pecaac){
return 0;
}
while ((c+1)<8){
if (mat[l][c+1]=='.'){
return 0;
}
else if (mat[l][c+1]== pecaac){
return 1;
}
else{
legal= 0;
}
c=c+1;
}
return(legal);
}
int hore(char mat[7][7], int l, int c, char pecaac){
int legal=0;
if (c== 0){
return 0;
}
if (mat[l][c]!='.'){
return 0;
}
if (mat[l][c-1]==pecaac){
return 0;
}
while (0<=(c-1)){
if (mat[l][c-1]=='.'){
return 0;
}
else if (mat[l][c-1]== pecaac){
return 1;
}
else {
legal=0;
}
c=c-1;
}
return (legal);
}
int verb(char mat[7][7], int l, int c, char pecaac){
int legal;
if (l== 7){
return 0;
}
if (mat[l][c]!='.'){
return 0;
}
if (mat[l+1][c]==pecaac){
return 0;
}
while ((l+1)<8){
if (mat[l+1][c]=='.'){
return 0;
}
else if (mat[l+1][c]== pecaac){
return 1;
}
else{
legal=0;
}
l=l+1;
}
return (legal);
}
int verc(char mat[7][7], int l, int c, char pecaac){
int legal;
if (l== 0){
return 0;
}
if (mat[l][c]!='.'){
return 0;
}
if (mat[l-1][c]==pecaac){
return 0;
}
while (0<=(l-1)){
if (mat[l-1][c]=='.'){
return 0;
}
else if (mat[l-1][c]== pecaac){
return 1;
}
else{
legal = 0;
}
l=l-1;
}
return (legal);
}
int diads(char mat[7][7], int l, int c, char pecaac){
int legal;
if (l== 0 || c== 7){
return 0;
}
if (mat[l][c]!='.'){
return 0;
}
if (mat[l-1][c+1]==pecaac){
return 0;
}
while (0<=(l-1) && c+1<8){
if (mat[l-1][c+1]=='.'){
return 0;
}
else if (mat[l-1][c+1]== pecaac){
return 1;
}
else{
legal = 0;
}
l=l-1;
c=c+1;
}
return (legal);
}
int diadi(char mat[7][7], int l, int c, char pecaac){
int legal;
if (l== 7 || c== 7){
return 0;
}
if (mat[l][c]!='.'){
return 0;
}
if (mat[l+1][c+1]==pecaac){
return 0;
}
while ((l+1)<8 && (c+1)<8){
if (mat[l+1][c+1]=='.'){
return 0;
}
else if (mat[l+1][c+1]== pecaac){
return 1;
}
else{
legal = 0;
}
l=l+1;
c=c+1;
}
return (legal);
}
int diaes(char mat[7][7], int l, int c, char pecaac){
int legal;
if (l== 0 || c== 0){
return 0;
}
if (mat[l][c]!='.'){
return 0;
}
if (mat[l-1][c-1]==pecaac){
return 0;
}
while (0<=(l-1) && 0<=(c-1)){
if (mat[l-1][c-1]=='.'){
return 0;
}
else if (mat[l-1][c-1]== pecaac){
return 1;
}
else{
legal = 0;
}
l=l-1;
c=c-1;
}
return (legal);
}
int diaei(char mat[7][7], int l, int c, char pecaac){
int legal;
if (l== 7 || c== 0){
return 0;
}
if (mat[l][c]!='.'){
return 0;
}
if (mat[l+1][c-1]==pecaac){
return 0;
}
while ((l+1)<8 && 0<=(c-1)){
if (mat[l+1][c-1]=='.'){
return 0;
}
else if (mat[l+1][c-1]== pecaac){
return 1;
}
else{
legal = 0;
}
l=l+1;
c=c-1;
}
return (legal);
}
int clegal(char mat[7][7], int l, int c, char pecaac){
int ld,le,lc,lb;
int ldi, lds,lei,les;
int legal=0;
lb=verb(mat,l,c,pecaac);
lc=verc(mat,l,c,pecaac);
le=hore(mat,l,c,pecaac);
ld=hord(mat,l,c,pecaac);
ldi=diadi(mat,l,c,pecaac);
lds=diads(mat,l,c,pecaac);
lei=diaei(mat,l,c,pecaac);
les=diaes(mat,l,c,pecaac);
legal = lb+lc+le+ld+ldi+lds+lei+les;
printf("n %d",legal);
if (legal==0){
printf("Jogada ilegal");
}
else{
return 1;
}
}
int main(int argc, char *argv[])
{
char matriz[7][7];
char pecaj, pecaai;
int x,y;
pecaj='X';
pecaai='O';
inimatri(matriz);
showmat(matriz);
x=6;
y=4;
clegal(matriz,x,y,pecaj);
return 0;
}
我试图检查我是否添加了比数组可以存储的更多的数字,但我没有发现任何问题,也搜索了其他解决方案,但找不到任何
在我的Linux系统上测试代码时,它确实抛出了一个严重的错误。在检查您的代码时,一些事情似乎很突出,它们似乎导致了以一个严重错误结束。
首先,正如上面好的注释所指出的,对于数组元素何时从"1"开始,似乎存在一些混淆。或者是&;0&;,而且看起来这个程序确实是打算使用&;8 × 8&;数组,而不是"7 x 7"数组。
在审查以下"printf"声明,很明显,一个"8 × 8">
printf(" 0 1 2 3 4 5 6 7");
因此,考虑到这一点,我对程序进行了一些重构,以设置一个"8 x 8"数组以及从"0"7";符合";C"中常用和习惯的索引下标;项目。以下是您的程序的重构版本。
#include <stdio.h>
#include <stdlib.h>
void inimatri(char mat[8][8]) /* Going by the printout of rows and columns, it is intimated that there are eight rows and eight columns */
{
int l=0,c=0;
while (l<8)
{
while (c<8)
{
mat[l][c]='.';
c=c+1;
}
c=0;
l=l+1;
}
mat[3][3]='O';
mat[3][4]='X';
mat[4][3]='X';
mat[4][4]='O';
mat[2][5]='O';
mat[5][2]='O';
mat[3][2]='O';
mat[5][4]='O';
}
void showmat (char mat[8][8])
{
int l=0,c=0;
printf(" 0 1 2 3 4 5 6 7");
while (l<8)
{
printf( "n%d",l);
while (c<8)
{
printf( " %c",mat[l][c]);
c=c+1;
}
c=0;
l=l+1;
}
}
int hord(char mat[8][8], int l, int c, char pecaac)
{
int legal;
if (c== 8)
{
return 0;
}
if (mat[l][c]!='.')
{
return 0;
}
if (mat[l][c+1]==pecaac)
{
return 0;
}
while ((c+1)<8)
{
if (mat[l][c+1]=='.')
{
return 0;
}
else if (mat[l][c+1]== pecaac)
{
return 1;
}
else
{
legal= 0;
}
c=c+1;
}
return(legal);
}
int hore(char mat[8][8], int l, int c, char pecaac)
{
int legal=0;
if (c== 0)
{
return 0;
}
if (mat[l][c]!='.')
{
return 0;
}
if (mat[l][c-1]==pecaac)
{
return 0;
}
while (0<=(c-1))
{
if (mat[l][c-1]=='.')
{
return 0;
}
else if (mat[l][c-1]== pecaac)
{
return 1;
}
else
{
legal=0;
}
c=c-1;
}
return (legal);
}
int verb(char mat[8][8], int l, int c, char pecaac)
{
int legal;
if (l== 8)
{
return 0;
}
if (mat[l][c]!='.')
{
return 0;
}
if (mat[l+1][c]==pecaac)
{
return 0;
}
while ((l+1)<8)
{
if (mat[l+1][c]=='.')
{
return 0;
}
else if (mat[l+1][c]== pecaac)
{
return 1;
}
else
{
legal=0;
}
l=l+1;
}
return (legal);
}
int verc(char mat[8][8], int l, int c, char pecaac)
{
int legal;
if (l== 0)
{
return 0;
}
if (mat[l][c]!='.')
{
return 0;
}
if (mat[l-1][c]==pecaac)
{
return 0;
}
while (0<=(l-1))
{
if (mat[l-1][c]=='.')
{
return 0;
}
else if (mat[l-1][c]== pecaac)
{
return 1;
}
else
{
legal = 0;
}
l=l-1;
}
return (legal);
}
int diads(char mat[8][8], int l, int c, char pecaac)
{
int legal;
if (l== 0 || c== 8)
{
return 0;
}
if (mat[l][c]!='.')
{
return 0;
}
if (mat[l-1][c+1]==pecaac)
{
return 0;
}
while (0<=(l-1) && c+1<8)
{
if (mat[l-1][c+1]=='.')
{
return 0;
}
else if (mat[l-1][c+1]== pecaac)
{
return 1;
}
else
{
legal = 0;
}
l=l-1;
c=c+1;
}
return (legal);
}
int diadi(char mat[8][8], int l, int c, char pecaac)
{
int legal;
if (l== 8 || c== 8)
{
return 0;
}
if (mat[l][c]!='.')
{
return 0;
}
if (mat[l+1][c+1]==pecaac)
{
return 0;
}
while ((l+1)<8 && (c+1)<8)
{
if (mat[l+1][c+1]=='.')
{
return 0;
}
else if (mat[l+1][c+1]== pecaac)
{
return 1;
}
else
{
legal = 0;
}
l=l+1;
c=c+1;
}
return (legal);
}
int diaes(char mat[8][8], int l, int c, char pecaac)
{
int legal;
if (l== 0 || c== 0)
{
return 0;
}
if (mat[l][c]!='.')
{
return 0;
}
if (mat[l-1][c-1]==pecaac)
{
return 0;
}
while (0<=(l-1) && 0<=(c-1))
{
if (mat[l-1][c-1]=='.')
{
return 0;
}
else if (mat[l-1][c-1]== pecaac)
{
return 1;
}
else
{
legal = 0;
}
l=l-1;
c=c-1;
}
return (legal);
}
int diaei(char mat[8][8], int l, int c, char pecaac)
{
int legal;
if (l== 7 || c== 0)
{
return 0;
}
if (mat[l][c]!='.')
{
return 0;
}
if (mat[l+1][c-1]==pecaac)
{
return 0;
}
while ((l+1)<8 && 0<=(c-1))
{
if (mat[l+1][c-1]=='.')
{
return 0;
}
else if (mat[l+1][c-1]== pecaac)
{
return 1;
}
else
{
legal = 0;
}
l=l+1;
c=c-1;
}
return (legal);
}
int clegal(char mat[8][8], int l, int c, char pecaac)
{
int ld,le,lc,lb;
int ldi, lds,lei,les;
int legal=0;
lb=verb(mat,l,c,pecaac);
lc=verc(mat,l,c,pecaac);
le=hore(mat,l,c,pecaac);
ld=hord(mat,l,c,pecaac);
ldi=diadi(mat,l,c,pecaac);
lds=diads(mat,l,c,pecaac);
lei=diaei(mat,l,c,pecaac);
les=diaes(mat,l,c,pecaac);
legal = lb+lc+le+ld+ldi+lds+lei+les;
printf("nLegal: %dn",legal); /* Just to clarify what this value is when it is printed */
if (legal==0)
{
printf("Jogada ilegal");
}
else
{
return 1;
}
return 0; /* Added this to address a compiler warning regarding not returning an integer value if this point is reached */
}
int main(int argc, char *argv[])
{
char matriz[8][8];
char pecaj, pecaai; /* FYI - the compiler warned that variable pecaai is set but not used */
int x,y;
pecaj='X';
pecaai='O';
inimatri(matriz);
showmat(matriz);
x=6;
y=4;
clegal(matriz,x,y,pecaj);
return 0;
}
需要指出的关键问题
- 如上所述,二维数组被放大为"8 × 8";索引值范围从";0&;"7"。
- "if"根据需要修改测试,以确保索引值大于或等于"0";且小于或等于"7"
- 处理"clegal"中的编译器警告。函数,额外的"return"语句被添加为一个捕获所有条件,以确保在到达函数结束时返回正确的整数值。
在我的Linux系统终端上,下面是一个示例输出:
@Vera:~/C_Programs/Console/Smash/bin/Release$ ./Smash
0 1 2 3 4 5 6 7
0 . . . . . . . .
1 . . . . . . . .
2 . . . . . O . .
3 . . O O X . . .
4 . . . X O . . .
5 . . O . O . . .
6 . . . . . . . .
7 . . . . . . . .
Legal: 1
在你空闲的时候回顾一下这些重构的代码,看看它是否符合你的项目精神。