数组bidimensional上的位置0 0不保存整数

时间:2016-04-14 15:32:33

标签: c

这是我在stackoverflow上的第一篇文章。我对我的课程有所了解,而我的老师并不知道发生了什么,他建议请求stackoverflow(你应该得到他的薪水)。 嗯,这是我的代码:

#include <stdio.h>

#define MAX_X 3
#define MAX_Y 3
#define SYMBOL_X "X"
#define SYMBOL_Y "Y"
#define SYMBOL_EMPTY -1
#define FALSE 0
#define TRUE 1

void printBoard(int board[MAX_X][MAX_Y]){
    printf("\n");
    printf("%d\t%d\t%d\n",board[0][0],board[1][0],board[2][0]);
    printf("\n");
    printf("%d\t%d\t%d\n",board[0][1],board[1][1],board[2][1]);
    printf("\n");
    printf("%d\t%d\t%d\n",board[0][2],board[1][2],board[2][2]);
    printf("\n");
}
void fillboard(int board[MAX_X][MAX_Y]){
    int i,j;
    for (i = 0; i < MAX_Y; ++i){
        for (j = 0; j < MAX_X; ++j){
            board[j][i]=SYMBOL_EMPTY;
        }
    }
}
int findEmptyBox(int board[MAX_X][MAX_Y])
{
    int i,j;
    for (i = 0; i < MAX_Y; ++i){
        for (j = 0; j < MAX_X; ++j){
            if(board[j][i]=SYMBOL_EMPTY)return FALSE;
        }
    }
    return TRUE;
}
int checkBoxIntroduced(int x,int y){
    if((x!=0 && x!=1 && x!=2) || (y!=0 && y!=1 && y!=2)){
        printf("Alguna de las casillas no ha sido introducida correctamente\n");
        return FALSE;
    }
    return TRUE;
}
void introducirFichaConDialogos(int board[MAX_X][MAX_Y],int player){
    int x,y;
    do{
    printf("Introduce la posicion X: \n");
    scanf("%d",&x);
    printf("Introduce la posicion Y: \n");
    scanf("%d",&y);
    }while(!checkBoxIntroduced(x,y));
    if(player==0)board[x][y]=1;
    else board[x][y]=2;
}
void checkPlayer(int *pplayer){
    if(*pplayer==1)*pplayer=0;
    else *pplayer=1;
}
void main(){
    int x=0,y=0,board[MAX_X][MAX_Y],i,j,player=0;
    fillboard(board);
    do{
        system("clear");
        printBoard(board);
        introducirFichaConDialogos(board,player);
        checkPlayer(&player);
    }while(!findEmptyBox(board));
}

我的问题是只有棋盘[0] [0]没有保存符号而我和我的老师不知道发生了什么,为什么只有0 0位置。 感谢您的帮助,如果有人有意见,我将不胜感激。

3 个答案:

答案 0 :(得分:4)

数组确实将值保存在

if(board[j][i]=SYMBOL_EMPTY)return FALSE;

且只有board[0][0]受到影响,因为SYMBOL_EMPTY非零,因此控件将从函数返回。

你的意思是比较而不是作业吗? e.g。

if(board[j][i]==SYMBOL_EMPTY)return FALSE;

答案 1 :(得分:1)

gcc在编译此代码时会引发很多警告:

[fbgo448@n9dvap997]~/prototypes/board: gcc -o board -std=c99 -pedantic -Wall board.c
board.c: In function âfindEmptyBoxâ:
board.c:33: warning: suggest parentheses around assignment used as truth value
board.c: At top level:
board.c:60: warning: return type of âmainâ is not âintâ
board.c: In function âmainâ:
board.c:64: warning: implicit declaration of function âsystemâ
board.c:61: warning: unused variable âjâ
board.c:61: warning: unused variable âiâ
board.c:61: warning: unused variable âyâ
board.c:61: warning: unused variable âxâ

第一个警告是抱怨以下内容:

if(board[j][i]=SYMBOL_EMPTY)return FALSE;

SYMBOL_EMPTY分配给board[j][i],而不是分配给彼此。由于SYMBOL_EMPTY非零,因此赋值表达式的值不为零,因此函数会立即返回FALSE

将其更改为

if(board[j][i] == SYMBOL_EMPTY) return FALSE;

你可以分配到0,0。

与常量表达式进行比较时的常见做法是将常量放在==运算符的左侧,如下所示:

if ( SYMBOL_EMPTY == board[i][j] )

这样,如果您不小心编写=而不是==,编译器将捕获它并发出诊断(常量表达式不能是赋值语句的目标)。当两个操作数都是变量时,这并没有帮助,而且我自己从未以这种方式编写比较,但它可能会有所帮助。

下一个警告是抱怨

void main()

main返回int,而不是void;将其更改为

int main( void )

虽然这不是您的主要问题(=而不是==),但您需要修复此问题。有些奇怪的平台会阻塞使用void main()的程序。

您还希望包含stdlib.h以摆脱功能系统的隐含声明&#34;警告。

你也应该摆脱任何未使用的变量,但这并不重要,而不是你现在面临的问题。

答案 2 :(得分:0)

比较表达式应该这样写:

const int VAR = 0;

int main(void) {
    if(VAR==3) return 1;
    return 0;
}

因此,如果您忘记了一个=,则会收到编译错误:

prog.c: In function 'main':
prog.c:6:9: error: assignment of read-only variable 'VAR'
  if(VAR =3) return 1;