【问题标题】:error: expected '=', ',', ';', 'asm' or '__attribute__' before '.' token错误:在 '.' 之前应有 '='、','、';'、'asm' 或 '__attribute__'令牌
【发布时间】:2022-01-01 00:41:51
【问题描述】:

我正在尝试用 C 语言为 Game Boy Advance 创建一个 1bpp 位图字体,本质上我想创建一个由 (ASCII CODE - 32)*8 索引的连续 ROM 数据区域。到目前为止,我收到了这个我不明白的错误消息。

错误:

C:/Users/puppy/Documents/ARMDevTools/SrcGBA/PaintBoyAdvance/source/paintboyadvance.c:35:14: error: expected '=', ',', ';', 'asm' or '__attribute__' before '.' token
   35 | bitmapfont[0].pixelsPerLetter[] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
      |              ^
C:/Users/puppy/Documents/ARMDevTools/SrcGBA/PaintBoyAdvance/source/paintboyadvance.c:36:14: error: expected '=', ',', ';', 'asm' or '__attribute__' before '.' token
   36 | bitmapfont[1].pixelsPerLetter[] = {0x10,0x18,0x18,0x18,0x18,0x00,0x18,0x00};
      |              ^
================ READY ================

导致错误的源代码(最小可重现示例):

struct letter{
    char PixelsPerLetter[8];
};

struct letter bitmapfont[96];
bitmapfont[0].PixelsPerLetter[] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
bitmapfont[1].PixelsPerLetter[] = {0x10,0x18,0x18,0x18,0x18,0x00,0x18,0x00};


int main(void)
{
    
    return 0;
}

据我所知,我没有在行尾缺少任何分号,所以我不明白为什么我什至需要列出的字符。这就是你在数组中定义每个结构的方式,不是吗?有这样的点?这就是我看到的所有示例所显示的内容,但我得到了这个错误。

编辑:将所有内容移入 main 会给我一个不同的错误:

C:/Users/puppy/Documents/ARMDevTools/SrcGBA/PaintBoyAdvance/source/paintboyadvance.c:12:39: error: expected expression before ']' token
   12 |         bitmapfont[0].PixelsPerLetter[] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
      |                                       ^
C:/Users/puppy/Documents/ARMDevTools/SrcGBA/PaintBoyAdvance/source/paintboyadvance.c:13:39: error: expected expression before ']' token
   13 |         bitmapfont[1].PixelsPerLetter[] = {0x10,0x18,0x18,0x18,0x18,0x00,0x18,0x00};

这个我也看不懂。

【问题讨论】:

  • 以后再问这样的问题,或者标记的问题不是同一个问题的时候,准备一个minimal reproducible example
  • 由于缺少 MCVE,很难判断您的代码是否在函数内部。如果它在任何函数之外,则链接的副本包含答案。无论如何,没有成员pixelsPerLetter,但有成员PixelsPerLetter。毕竟,C 中的标识符是区分大小写的......而且你不能为这样的数组赋值。你只能用这样的初始化列表初始化数组,但不能赋值。
  • 您的编辑修复了 2 个错误,但第三个仍然存在。
  • 如果您不想使用初始化列表,您可以使用复合文字来设置数组元素的值:memcpy(&bitmapfont[0].PixelsPerLetter, (char[8]){0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, sizeof(bitmapfont[0].PixelsPerLetter));
  • struct letter bitmapfont[96] = {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, {0x10,0x18,0x18,0x18,0x18,0x00,0x18,0x00}, { /* etc */ }, };

标签: arrays c struct embedded game-boy-advance


【解决方案1】:

您只能在实例化时初始化。您在任何函数之外尝试了赋值 - 这将不起作用。

struct letter bitmapfont[96]= { {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
                                {0x10,0x18,0x18,0x18,0x18,0x00,0x18,0x00} } ;

【讨论】:

    【解决方案2】:

    您可以初始化在文件范围内声明的变量,但不能对其赋值,因为赋值被视为运行时代码。在运行时执行的所有代码都必须位于函数内部。

    如前所述,您可以通过重写代码以使用初始化来解决此问题:

    struct letter bitmapfont[96] = 
    {
      [0] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
      [1] = {0x10,0x18,0x18,0x18,0x18,0x00,0x18,0x00},
      ...
    };
    

    这听起来像是不应该在运行时更改的东西,所以您应该添加const 并确保它在闪存中分配。

    如果您出于某种原因确实需要在运行时更改它,可以使用复合文字:

    {
      // inside a function
    
      bitmapfont[0] = (struct letter){0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
    }
    

    【讨论】:

      猜你喜欢
      • 2012-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多