函数返回C';行不通

函数返回C';行不通,c,structure,type-conversion,minesweeper,C,Structure,Type Conversion,Minesweeper,我是c语言的新手,正在尝试创建扫雷游戏。我认为我的代码在数据类型转换方面有一些问题,但我不明白为什么。选中此链接 并试图在我的代码中实现这些信息 我正在尝试实现一个函数,该函数返回具有地雷的x,y坐标2D阵列的相邻位置数 int neighbours(const Field *f, unsigned int x, unsigned int y) { int z = 0; int i,j; unsigned int a = y-1; j =(int)a;

我是c语言的新手,正在尝试创建扫雷游戏。我认为我的代码在数据类型转换方面有一些问题,但我不明白为什么。选中此链接

并试图在我的代码中实现这些信息

我正在尝试实现一个函数,该函数返回具有地雷的x,y坐标2D阵列的相邻位置数

int neighbours(const Field *f, unsigned int x, unsigned int y)
{
    int z = 0;
    int i,j;
    unsigned int a = y-1;
    j =(int)a;
    unsigned int b =x-1;
    i = (int)b;

    for(; j<=(a+2); j++){
        if(j>=0 && j<=f->ysize){
            for (; i<=(b+2); i++){
                if ( i>=0 && i<=f->xsize && (f->places[j][i] == UNKNOWN_MINE ||f->places[j][i] == KNOWN_MINE)){
                    z++;
                 }

             }
            i = b;
        }  
    }
    return z;
 }
int邻域(常量字段*f,无符号整数x,无符号整数y)
{
int z=0;
int i,j;
无符号整数a=y-1;
j=(int)a;
无符号整数b=x-1;
i=(int)b;
对于(;j=0&&jysize){
对于(;i=0&&ixsize&&(f->places[j][i]==未知矿| f->places[j][i]==已知矿)){
z++;
}
}
i=b;
}  
}
返回z;
}
代码

unsigned a = y-1;
如果y==0,则为您提供一个==UINT\u MAX

状况

  j >= 0
只是说“如果这个非负整数不是负的”,所以不是很有帮助

一个好主意是使用一些填充来存储数据,在矩形映射的每一侧填充一个宽度的整数,所有这些整数都有一个uniqe值,您可以称之为padding_FIELD

这样,您的功能将更简单、更有效:

int neighbours(const Field *f, unsigned int x, unsigned int y)
{
  int z = 0;

  assert(x > 0 && x < UINT_MAX);
  assert(y > 0 && y < UINT_MAX);

  for(unsigned int j = y-1; j <= y+1); j++) {
        for (unsigned int i = x-1; i <= x+1; i++) {
            if ((f->places[j][i] == UNKNOWN_MINE ||f->places[j][i] == KNOWN_MINE)){
                z++;
            }
        }
  }
  return z;
}

什么不起作用?如果
x
y
始终为0,则
x-1
y-1
将不会为您提供
-1
,因为它们没有签名。取而代之的是,它将变成
INT\u MAX
,您能详细说明一下吗?你有什么问题?你有没有试过在调试程序中一行一行地调试代码?当我开车去商店时,我从来不会说“它坏了,请修理一下”。我说“它不起作用。当我踩到刹车时,它不会减速。请修复它。”在这里应用“它不起作用。当我输入X时,结果应该是Y,但我得到Z。”
    static const field mine = 4;
    static const field known = 8;

    inline bool is_mine(field f)
    {
            return (f & mine) != 0;
    }

    inline bool is_knownmine(field f)
    {
            return (f & mine & known) != 0;
    }

    inline bool is_unknownmine(field f)
    {
            return is_mine(f) && !is_knownmine(f);
    }

    int neighbors(....)
    {
     .....
      if (is_mine(f->places[j][i]) {
          ++z;
      }
     .....
    }