C 有没有更好的方法来确保矩阵之外的元素是';没有访问?

C 有没有更好的方法来确保矩阵之外的元素是';没有访问?,c,performance,matrix,multidimensional-array,segmentation-fault,C,Performance,Matrix,Multidimensional Array,Segmentation Fault,我正在使用Ncurses库用C编写游戏跳棋,我将所有棋子都存储在一个矩阵g.board中,在寻找可能的移动时,我需要确保程序不会尝试访问矩阵之外的元素,因为分割错误。我有一个解决方案,但感觉相当粗糙,我觉得有一种更优雅的方法可以做到这一点,但我找不到或想不出来 int x和int y指的是矩阵中的x和y位置,我想寻找可能的移动char-ck只是告诉我,如果这件作品是一种颜色,那么普通的颜色只能向一个方向移动g.board[y][x]。可能只是结构中的bool变量,它告诉我是否可能移动 据我所知,

我正在使用Ncurses库用C编写游戏跳棋,我将所有棋子都存储在一个矩阵g.board中,在寻找可能的移动时,我需要确保程序不会尝试访问矩阵之外的元素,因为分割错误。我有一个解决方案,但感觉相当粗糙,我觉得有一种更优雅的方法可以做到这一点,但我找不到或想不出来

int x
int y
指的是矩阵中的x和y位置,我想寻找可能的移动
char-ck
只是告诉我,如果这件作品是一种颜色,那么普通的颜色只能向一个方向移动
g.board[y][x]。可能
只是结构中的bool变量,它告诉我是否可能移动

据我所知,它是有效的,我没有做过很多测试,但感觉很粗糙。 对于任何错误或不是最佳编码,我深表歉意,我对此相当陌生

是否有更好的方法确保不访问矩阵之外的元素

在C中,唯一可靠的方法是(在运行时)检查用于访问矩阵的索引,或者(在编译之前)证明这不会发生。像这样的工具可以帮助你做出这样的证明。但是,请注意

访问外部的元素(包含该元素的数组的范围)有些困难。所以,如果你这样做,任何事情都可能发生(不幸的是,这包括没有可观察到的行为受到影响),所以就这样吧

在Linux上,您还可以在运行时使用。这通常很有帮助

如果
x
为负数(或高于棋盘格的尺寸),则代码可能错误。你最好也检查一下这个案例,或者证明它不可能发生

另见。您可能想要使用它(它可以执行运行时检查)


你真的应该理解未定义的行为意味着什么(即使是作为一个新手程序员)。阅读也请阅读。如果您使用一些编译器,它将作为
gcc-Wall-Wextra-g
来获取警告和调试信息。改进您的代码,使其不出现警告(或者任何调试器)。

有一件事看起来很可疑
g.board[y-1][x-1]。可能==true
应该是
g.board[y-1][x-1]。可能=true
。当前代码不起任何作用

代码也非常复杂。看看这个:

void checkPossible(int y, int x, char ck);
{
    bool left = x != 0, 
         right = x != 8, 
         top = y !=8, 
         bottem = y!=0;

    // Sets g.board.possible to true if possible move
    if(ck == 'k' || ck == 'w') {
        g.board[y - 1][x - 1].possible = (top && left);
        g.board[y - 1][x + 1].possible = (top && right);
        g.board[y + 1][x - 1].possible = (bottem && left);
        g.board[y + 1][x + 1].possible = (bottem && right);
    }
}
通常,不要将布尔变量与布尔常量true和false或其他值进行比较。直接按原样使用它们,并给它们起描述性名称

另外,我会(可能,因为我没有看到代码的其余部分)分割坐标和字符的检查。单个函数中的功能越少,就越容易理解、维护和命名。像这样:

bool isValidCoordinate(int y, int x) {
    return y>=0 && y<=8 && x>=0 && x<=8;
}

bool isValidCharacter(char ck) {
    return ck == 'k' || ck == 'w';
}
bool isvalidcoordination(int y,int x){

返回y>=0&&y=0&&x
g.board[y-1][x-1]。可能==true;
应该使用
=
,而不是
=
。如果(y!=0){top=true;}
,我不会得到
如果(y!=0){top=true;}
。如果y不是0,那么你在顶部?因为
如果(x!=0)}
{right=true;{
我怀疑您从未成功编译过此代码。请仔细检查您显示的代码是否与您正在处理的内容密切相关。也许可以尝试一个。另一方面,问题更像是“请审阅”类型,而不适合StackOverflow。不要编写类似于
if(bottom==true)的内容
。只需编写
if(底部)
。如果你有完整的工作代码需要反馈,codereview.stackexchange.com是一个合适的去处。你会惊讶于你能在那里得到的反馈数量。请注意,当你在那里发布时,代码应该是有效的。这不是为了发现bug。这是他正在做的,不是吗?他只是问是否有更好的方法来c对。是的,正如我回答的,这是一个证明。我认为他并没有很好地解释他的问题。他并不担心
x
y
输入无效。他正在测试
x
y
的邻居,并希望确保当他们处于边缘时他不会出去。如果我在下面,如果x是负数,你的代码可能是错误的站在他的立场上,
x
永远不能是负数。他只是想知道x,y的哪个邻居在板内。我们没有,所以我不知道
x
是否可以是负数。是的,很抱歉,我在程序中修复了这个错误。我没有想过使用这些值本身。我从未见过这样的代码,这是有道理的,我只是不知道这是可能的,谢谢。
bool isValidCoordinate(int y, int x) {
    return y>=0 && y<=8 && x>=0 && x<=8;
}

bool isValidCharacter(char ck) {
    return ck == 'k' || ck == 'w';
}