【问题标题】:Why am I getting this error when trying to print a matrix in c?尝试在 c 中打印矩阵时为什么会出现此错误?
【发布时间】:2014-08-09 04:43:34
【问题描述】:

我搜索了几个有关如何打印矩阵的视频和教程,它们引导我找到了这个:

void
init(void)
{
    board[3][3] = {{8,  7,  6}, 
                   {5,  4,  3},
                   {2,  1,  0}};
}

void
draw(void)
{                  
    for (int row = 0; row < d; row++)
    {
        for (int column = 0; column < d; column++)
        {
            printf("%i", board[row][column]);
        }
    }
}

代码很有意义。我明白了。我已经看到人们在视频中使用它来打印矩阵并且它有效!但是当我尝试时,我得到了错误:

“‘{’标记之前的预期表达式”就行了:“board[3][3] = ...”

我也不知道为什么。有没有人知道怎么回事?

【问题讨论】:

  • 上一行可能有语法错误。
  • 这看起来不错。可能上一行有一些语法错误!
  • 可能您不在 C99 编译器模式下。循环初始声明只允许在 C99 模式下使用。
  • 您可能在上一行缺少分号。
  • 有错误 before 开头{ - 包括该行之前的所有代码。编译器在 in context 代码停止有意义的那一行报告错误,并且您没有提供该片段所在的上下文,这本身是有效的;是前面的代码使它无效。

标签: c matrix


【解决方案1】:

这不是有效的 C:

board[3][3] = {{8,  7,  6}, 
               {5,  4,  3},
               {2,  1,  0}};

要么在声明时初始化它,要么一次为每个元素分配一个。

【讨论】:

  • 或将 C99 复合文字与 memcpy 结合使用。
【解决方案2】:
board[3][3] = {{8,  7,  6}, 
               {5,  4,  3},
               {2,  1,  0}};

必须是:

int board[3][3] = {{8,  7,  6}, 
                   {5,  4,  3},
                   {2,  1,  0}};

但正如@dreamlax 所指出的,这仅在board 被声明并初始化为全局时才有效。

此代码使用复合文字在 C99 上工作:

void
init(void)
{
    memcpy(board, (int[][3]){{8, 7, 6}, {5, 4, 3}, {2, 1, 0}}, sizeof board);
}

便携方式是:

void
init()
{
    int temp[][3] = {{8, 7, 6}, {5, 4, 3}, {2, 1, 0}};

    memcpy(board, temp, sizeof board);
}

【讨论】:

  • 除了这种情况,boardinit 结束后将不再存在。 board 必须在文件范围内才能在 draw 中访问(或作为参数传入)。
【解决方案3】:

您的程序中可能出现的错误:-

1) 在{ 之前的行或调用init(void) 的主函数中缺少分号。

2) 改变

board[3][3] = {{8,  7,  6}, 
               {5,  4,  3},
               {2,  1,  0}};

int board[3][3] = {{8,  7,  6}, 
               {5,  4,  3},
               {2,  1,  0}};

3)

for (int row = 0; row < d; row++)

for (int column = 0; column < 3; column++)

仅在最新的C99 编译器模式下才允许在循环本身内声明变量。就这样吧,

int row, column;
for (row = 0; row < d; row++) {
for (column = 0; column < 3; column++) {
} }

4) 你没有在任何地方声明d(数组大小)。要么使用文件顶部的#define 使其成为宏,要么将其作为参数传递给函数draw(void),或者在函数draw 中显式定义它。

但无论如何,我看不出在init 函数中使用一个恒定大小的数组3,然后在draw 函数中使用一个变量来访问它的元素。

【讨论】:

  • 我的错。我忘了说 d 和 board 已经被声明为全局变量。我正在使用 c99 编译器模式。下次我会尝试指定所有内容。还是谢谢
【解决方案4】:

您缺少关键字int,它也是数组变量的数据类型:

void 
init(void)
{
    int board[3][3] = {{8, 7, 6}, {5, 4, 3}, {2, 1, 0}}; 
}

【讨论】:

  • 请原谅我被淹没了,我是用手机接的。
  • 当你这样做时,board 将只能在 init 函数中访问,而不能在任何其他函数中访问
【解决方案5】:

试试这个代码:-

int board[3][3] = {8, 7, 6, 5, 4, 3, 2, 1} 

for (int row = 0; row <3; row++)
{
    for (int column = 0; column < 3; column++)
    {
        printf("%d ", board[row][column]);
    }
}  

【讨论】:

    【解决方案6】:

    有效的代码是

    int board[3][3] = {8,  7,  6, 5,  4,  3, 2,  1,  0};
    
    for (int row = 0; row < 3; row++)
    {
        for (int column = 0; column < 3; column++)
        {
            printf("%d ", board[row][column]);
        }
    }
    

    【讨论】:

    • %i 等价于%d
    • 像这样的硬编码for循环边界使得改变数组的大小变得更加困难。
    猜你喜欢
    • 2019-08-03
    • 2013-03-07
    • 2016-09-01
    • 1970-01-01
    • 2012-03-09
    • 1970-01-01
    • 1970-01-01
    • 2013-08-14
    • 1970-01-01
    相关资源
    最近更新 更多