我正在尝试制作一个Intel 8080 CPU仿真器(然后我想仿效使用它的Space Invaders)。
我编写了几乎完整的CPU实现(感谢MAME和Tickle项目(主要是);))除了无记录指令(0x08,0x10,0x18,0x20,0x28,0x30,0x38,0x0CB,0x0D9,0x0DD,0x0ED, 0x0FD)。
编译时我只有问题,我不知道为什么。
这是代码:
static const unsigned char cycles_table[256] =
{
/* 8080's Cycles Table */
/* 0 1 2 3 4 5 6 7 8 9 A B C D E F */
/*0*/ 4, 10, 7, 5, 5, 5, 7, 4, 0, 10, 7, 5, 5, 5, 7, 4,
/*1*/ 0, 10, 7, 5, 5, 5, 7, 4, 0, 10, 7, 5, 5, 5, 7, 4,
/*2*/ 0, 10, 16, 5, 5, 5, 7, 4, 0, 10, 16, 5, 5, 5, 7, 4,
/*3*/ 0, 10, 13, 5, 10, 10, 10, 4, 0, 10, 13, 5, 5, 5, 7, 4,
/*4*/ 5, 5, 5, 5, 5, 5, 7, 5, 5, 5, 5, 5, 5, 5, 7, 5,
/*5*/ 5, 5, 5, 5, 5, 5, 7, 5, 5, 5, 5, 5, 5, 5, 7, 5,
/*6*/ 5, 5, 5, 5, 5, 5, 7, 5, 5, 5, 5, 5, 5, 5, 7, 5,
/*7*/ 7, 7, 7, 7, 7, 7, 7, 7, 5, 5, 5, 5, 5, 5, 7, 5,
/*8*/ 4, 4, 4, 4, 4, 4, 7, 4, 4, 4, 4, 4, 4, 4, 7, 4,
/*9*/ 4, 4, 4, 4, 4, 4, 7, 4, 4, 4, 4, 4, 4, 4, 7, 4,
/*A*/ 4, 4, 4, 4, 4, 4, 7, 4, 4, 4, 4, 4, 4, 4, 7, 4,
/*B*/ 4, 4, 4, 4, 4, 4, 7, 4, 4, 4, 4, 4, 4, 4, 7, 4,
/*C*/ 5, 10, 10, 10, 11, 11, 7, 11, 5, 10, 10, 0, 11, 17, 7, 11,
/*D*/ 5, 10, 10, 10, 11, 11, 7, 11, 5, 0, 10, 10, 11, 0, 7, 11,
/*E*/ 5, 10, 10, 18, 11, 11, 7, 11, 5, 5, 10, 4, 11, 0, 7, 11,
/*F*/ 5, 10, 10, 4, 11, 11, 7, 11, 5, 5, 10, 4, 11, 0, 7, 11
};
g ++带给我这个错误:
8080.h:521:错误:非整数类型的静态数据成员的类内初始化无效`const unsigned char [256]'
此数组位于名为i8080的类中。
答案 0 :(得分:12)
就像它说的那样,你不能在类定义中初始化静态非整数类型。也就是说,你可以这样做:
static const unsigned value = 123;
static const bool value_again = true;
但不是别的。
你应该做的是把它放在你的班级定义中:
static const unsigned char cycles_table[256];
在相应的源文件中,放置您拥有的内容:
const unsigned char i8080::cycles_table[256] = // ...
这是做什么的(在定义中),“嘿,这将是这个阵列。”在源文件中,“嘿,这是那个数组。”
答案 1 :(得分:0)
静态数据成员需要在类之外初始化。
答案 2 :(得分:0)
您无法初始化嵌入在类中的静态数组:
class Thing
{
public:
static const int [3] = {1, 2, 3};
};
你必须这样做:
<强> thing.h:强>
class Thing
{
public:
static const int vals[3];;
};
<强> thing.cpp:强>
const int Thing::vals[3] = {1, 2, 3};