我正在尝试构建一个简单的VM。我有一个数组代表它的内存(uint8_t
数组)。为了更具表现力,typedef
数组uint8_t
:
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;
}
解决此问题的最佳方法是什么?我想要一个类型名称,它表明它不仅仅是一个数组,而是内存。而且我还希望将它传递给代码库并读取/修改它的值。
谢谢!
答案 0 :(得分:3)
这将是(正确的访问方式)
(*m)[cs->sp] = cs->pc & 0xff;
由于指向数组的指针属于uint8_t (*)[]
类型(这是m
的类型)。因此,您需要在访问其元素之前取消引用它。
此外,如果您只是使用chip8_memory m
作为函数的参数,那么您可以按照自己的方式访问它 - 前提是您将数组作为参数传递。
答案 1 :(得分:2)
类型chip8_memory*
是数组的指针,它不是数组本身。 chip8_memory*
的类型为uint8_t (*)[0xfff]
。
这意味着m[any_index]
是一个chip8_memory
数组。使用m
(使用当前声明)的唯一可能方式是m[0][cs->sp]
或(*m)[cs->sp]
。
解决方案?不要让m
成为指针。