C 函数执行后,my int变量的值可以任意更改 我现在在一个编码任务的中间,在其中我们为反游戏(Othelo)创建一个游戏板,给它一些初始条件,并检查移动的合法性。

C 函数执行后,my int变量的值可以任意更改 我现在在一个编码任务的中间,在其中我们为反游戏(Othelo)创建一个游戏板,给它一些初始条件,并检查移动的合法性。,c,C,代码首先询问用户电路板的大小(边长),并使用一个函数初始化电路板,另一个函数打印电路板 我的代码适用于boardDim=4和boardDim=6,但是当我输入8时,在负责初始化电路板的函数执行其所有语句后,boardDim的值跳到了21568,这导致了一个分段错误注意:实验室讲义说,我们可以假设电路板的边长永远不会超过26 谢谢你的阅读 这是我的密码: void InitBoard(char reversiBoard[][26], const int a) { for (int i =

代码首先询问用户电路板的大小(边长),并使用一个函数初始化电路板,另一个函数打印电路板

我的代码适用于boardDim=4和boardDim=6,但是当我输入8时,在负责初始化电路板的函数执行其所有语句后,boardDim的值跳到了21568,这导致了一个分段错误注意:实验室讲义说,我们可以假设电路板的边长永远不会超过26 谢谢你的阅读

这是我的密码:

void InitBoard(char reversiBoard[][26], const int a) {

    for (int i = 0; i < a; i++) {

        for (int j = 0; j < a; j++) {

            if ((i == (a / 2 - 1)) && (j == (a / 2 - 1))) {
                reversiBoard[i][j] = 'W';
            }
            else if ((i == (a / 2 - 1)) && (j == a / 2)) {
                reversiBoard[i][j] = 'B';
            }
            else if ((i == a / 2) && (j == (a / 2 - 1))) {
                reversiBoard[i][j] = 'B';
            }
            else if ((i == a / 2) && (j == a / 2)) {
                reversiBoard[i][j] = 'W';
            }
            else {
                reversiBoard[i][j] = 'U';
            }
        }
    }
    return;
}

void printBoardCurr(char reversiBoard[][26], const int a) {

    char alphabet[] = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z' };

    printf("  ");

    for (int i = 0; i < a; i++) {
        printf("%c", (alphabet[i]));
    }
    printf("\n\n");

    for (int j = 0; j < a; j++) {
        printf("%c ", (alphabet[j]));

        for (int k = 0; k < a; k++) {
            printf("%c", reversiBoard[j][k]);
        }
        printf("\n");
    }
    return;
}

int main(void) {

    int boardDim = 0;
    printf("Enter the board dimension: ");
    scanf(" %d", &boardDim);

    char reversiBoard[boardDim][boardDim];
    InitBoard(reversiBoard, boardDim);
    printBoardCurr(reversiBoard, boardDim);

    return 0;
}
void初始化板(字符反转板[][26],常数int a){
for(int i=0;i
void InitBoard(char reversiBoard[][26],const int a)
如果不将
26
输入为维度,则该属性是错误的。您可以使用
void InitBoard(const int a,char reversiBoard[][a])
26
不是数组的最大大小,它是数组的确切大小。这些人把
{
字符挂在行尾是怎么回事?太可怕了-把它自己放在一个新行上,就像结束的
}
一样!该字符标记范围块的开始。它与
if
while
、函数声明等无关,不应与之一起使用。像这样离开,他们会被删除,不匹配,失去了屏幕的尽头和许多其他恼人的问题。请不要这样做。旁注:您根本不需要
字母表
数组。如果所有函数都需要使用它,为什么
reversiBoard
是一个局部变量?只需将其设置为全局变量,并将大小设置为最大大小(26 x 26)。这会让一切变得更好,因为你没有把它放在任何地方。@mch这让我很惊讶。AFAIK数组总是按地址传递,而不是按值传递。但是,我想你是在正确的轨道上。函数
InitBoard()
将始终采用“内部尺寸”26,其中
main()
可根据请求调整尺寸。因此,
InitBoard()
中的指针算法将失败。