繁体   English   中英

Typedef数组类型不可分配

[英]Typedefed array type is not assignable

我正在尝试构建一个简单的VM。 我有一个代表它的内存的数组( uint8_t数组)。 为了更富有表现力,我对uint8_t数组进行了typedef

typedef uint8_t chip8_memory[0xfff];

我将此代码作为参考传递给我的代码库:

void chip8_2nnn(const chip8_opcode oc, chip8_cpu_state* cs, chip8_memory* m) {
    m[cs->sp]     = cs->pc & 0xff;
    m[cs->sp + 1] = cs->pc >> 8;
    cs->sp -= 2;
    cs->pc = nnn(oc);
}

上面的函数生成以下错误:

chip8.c:41:17: error: array type 'chip8_memory' (aka 'uint8_t [4095]') is not assignable
  m[cs->sp]     = cs->pc & 0xff;
  ~~~~~~~~~     ^
chip8.c:42:17: error: array type 'chip8_memory' (aka 'uint8_t [4095]') is not assignable
  m[cs->sp + 1] = cs->pc >> 8;
  ~~~~~~~~~~~~~ ^
2 errors generated.

最小的失败示例:

TEST(foo, bar) {
    typedef int foo[3];
    foo  bar = {1, 2, 3};
    foo* baz = &bar;

    bar[2] = 5;
    baz[2] = 5;
}

解决此问题的最佳方法是什么? 我想要一个类型名称,该名称表明它不仅是一个数组,而且是内存。 我也想将其传递给代码库,并读取/修改其值。

谢谢!

它将是(正确的访问方式将是)

(*m)[cs->sp]     = cs->pc & 0xff;

由于指向数组的uint8_t (*)[]的类型为uint8_t (*)[] (这是m的类型)。 因此,在访问其元素之前,需要先对其取消引用。

同样在这里,如果您只是将chip8_memory m用作函数的参数,则可以按照您的方式访问它-前提是您将数组作为参数传递。

chip8_memory*类型是指向数组的指针 ,而不是数组本身。 chip8_memory*的类型为uint8_t (*)[0xfff]

这意味着m[any_index]chip8_memory数组。 而且使用m的唯一可能方法(使用当前声明)就像m[0][cs->sp](*m)[cs->sp]

解? 不要让m成为指针。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM