2010-01-25 1 views
3

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

Я закодирован почти полную реализацию этого процессора (благодаря МАМЕ и проекта Tickle (в основном);)), за исключением undocument инструкции (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 
}; 

г ++ принимает мне эту ошибку:

8080.h:521: error: invalid in-class initialization of static data member of non- integral type `const unsigned char[256]'

Этот массив в классе называется i8080.

ответ

13

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

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

спасибо, @RSamuel. – GManNickG

+0

Добро пожаловать. –

+0

@Facon: проблем нет. :] Эмуляторы здорово сделать. – GManNickG

0

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

+0

Только нецелые типы. – GManNickG

+0

.. и неконстантные интегральные типы. – UncleBens

+0

К сожалению, я принял 'const'. – GManNickG

0

Вы не можете инициализировать статический массив, внедренного в классе, как это:

class Thing 
{ 
public: 
    static const int [3] = {1, 2, 3}; 
}; 

Вы должны сделать это так:

thing.h:

class Thing 
{ 
public: 
    static const int vals[3];; 
}; 

вещь.cpp:

const int Thing::vals[3] = {1, 2, 3};