Неизвестная ошибка при инициализации массива: неверная инициализация в классе статического члена данных нецелого типа `const unsigned char [256] ' - PullRequest
3 голосов
/ 26 января 2010

Я пытался создать эмулятор процессора Intel 8080 (тогда я хотел бы эмулировать Space Invaders, которые его используют).

Я закодировал почти полную реализацию этого процессора (благодаря 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.

Ответы [ 3 ]

12 голосов
/ 26 января 2010

Как говорится, вы не можете инициализировать статические нецелые типы в определении класса. То есть вы могли бы сделать это:

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] = // ...

То, что это делает, говорит (в определении): «Эй, будет этот массив». и в исходном файле «Эй, вот этот массив».

0 голосов
/ 26 января 2010

Вы не можете инициализировать статический массив, встроенный в класс следующим образом:

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};
0 голосов
/ 26 января 2010

Статические члены данных должны быть инициализированы вне класса.

...