2012-02-25 2 views
0

У меня проблемы с структуры при попытке сделать это в C++ (Visual Studio):Ошибка с Struct в C++

memoria.cpp

struct readMem { 
    UINT32 startAdress; 
    UINT32 endAdress; 
    UINT8(*memoryHandler) (UINT32); 
    void *pUserData; 
}; 

struct writeMem { 
    UINT32 startAdress; 
    UINT32 endAdress; 
    void (*memoryHandler) (UINT32, UINT8); 
    void *pUserData; 
}; 



void memoria::writeRAMBankEnable(UINT32 a, UINT8 b) { 
} 

void memoria::writeROMBankSelect(UINT32 a, UINT8 b) { 
} 

void memoria::writeRAMROMModeSelect(UINT32 a, UINT8 b) { 
} 

void memoria::writeVRAM(UINT32 a, UINT8 b) { 
} 

void memoria::writeSRAM(UINT32 a, UINT8 b) { 
} 

void memoria::writeRAM(UINT32 a, UINT8 b) { 
} 

void memoria::writeERAM(UINT32 a, UINT8 b) { 
} 

void memoria::writeSprite(UINT32 a, UINT8 b) { 
} 

void memoria::writeIOM(UINT32 a, UINT8 b) { 
} 

void memoria::writeHRAM(UINT32 a, UINT8 b) { 
} 


struct writeMem implWriteMem[] = { 
    { 0x0000, 0x1FFF, writeRAMBankEnable, NULL}, 
    { 0x4000, 0x5FFF, writeROMBankSelect, NULL}, 
    { 0x6000, 0x7FFF, writeRAMROMModeSelect, NULL}, 
    { 0x8000, 0x9FFF, writeVRAM, NULL}, 
    { 0xA000, 0xBFFF, writeSRAM, NULL}, 
    { 0xC000, 0xDFFF, writeRAM, NULL}, 
    { 0xE000, 0xFDFF, writeERAM, NULL}, 
    { 0xFE00, 0xFE9F, writeSprite, NULL}, 
    { 0xFF00, 0xFF7F, writeIOM, NULL}, 
    { 0xFF80, 0xFFFF, writeHRAM, NULL}, 
    { (UINT32) - 1, (UINT32) - 1, NULL, NULL} 
}; 

    memoria.h  

     #pragma once 

#include <stdlib.h> 
#include <stdio.h> 
#include "defs.h" 

ref class memoria 
{ 
public: 
    memoria(void); 

private: 
    FILE *file; 
    UINT8 *mem; 
public: 

    void writeRAMBankEnable(UINT32, UINT8); 

    void writeROMBankSelect(UINT32, UINT8); 

    void writeRAMROMModeSelect(UINT32, UINT8); 

    void writeVRAM(UINT32, UINT8); 

    void writeSRAM(UINT32, UINT8); 

    void writeRAM(UINT32, UINT8); 

    void writeERAM(UINT32, UINT8); 

    void writeSprite(UINT32, UINT8); 

    void writeIOM(UINT32, UINT8); 

    void writeHRAM(UINT32, UINT8); 

    UINT8 readRAMBankEnable(UINT32); 

    UINT8 readROMBankSelect(UINT32); 

    UINT8 readRAMROMModeSelect(UINT32); 

    UINT8 readVRAM(UINT32); 

    UINT8 readSRAM(UINT32); 

    UINT8 readRAM(UINT32); 

    UINT8 readERAM(UINT32); 

    UINT8 readSprite(UINT32); 

    UINT8 readIOM(UINT32); 

    UINT8 readHRAM(UINT32); 


    void Meminitialize(); 
    void MemcleanUp(); 

    void writeByte(UINT32, UINT8); 
    UINT8 readByte(UINT32); 

    void writeWord(UINT32, UINT16); 
    UINT16 readWord(UINT32); 
}; 

Visual Studio C++ дает мне эту ошибку :

1> memoria.cpp (75): ошибка C2065: 'writeRAMBankEnable': необъявленный идентификатор

1> memoria.cpp (76): ошибка C2065: 'writeROMBankSelect': необъявленный идентификатор

1> memoria.cpp (77): ошибка C2065: 'writeRAMROMModeSelect': необъявленный идентификатор

1> memoria.cpp (78): ошибка C2065: 'writeVRAM': необъявленный идентификатор

1> memoria.cpp (79): ошибка C2065: 'writeSRAM': необъявленный идентификатор

1> memoria.cpp (80): ошибка C2065: 'writeRAM': необъявленный идентификатор

1> memoria.cpp (81) : ошибка C2065: «writeERAM»: необъявленный идентификатор

1> memoria.cpp (82): ошибка C2065: 'writeSprite': необъявленный идентификатор

1> memoria.cpp (83): ошибка C2065: 'writeIOM': необъявленный идентификатор

1> Мемория. CPP (84): ошибка C2065: 'writeHRAM': необъявленный идентификатор

1> memoria.cpp (169): ошибка C2065: 'implReadMem': необъявленный идентификатор

1> memoria.cpp (179): ошибка C2065: «implReadMem»: необъявленный идентификатор

Для записи я объявил все функции в моих memoria.h, но все структуры и implWriteMem [], конечно. В любом случае, как я могу это решить?

P.S. Он хорошо работал в чистом C.

Спасибо!

+0

обеспечивает заголовок, невозможно сказать, что происходит – Anycorn

+0

Pure C не имеет пространства имен. Как это работало? –

+0

Вы пытаетесь создать функции члена DIY? О, боже !!!! – Anycorn

ответ

3
{ 0x0000, 0x1FFF, writeRAMBankEnable, NULL}, 

ли вы, возможно, имели в виду

{ 0x0000, 0x1FFF, &memoria::writeRAMBankEnable, NULL}, 

Вы должны включить имя класса, обращаясь к члену, за исключением в классе. И при создании указателя на функцию-член всегда нужно имя класса.

Лучшее решение состоит в использовании функции полиморфизм, встроенные в язык:

ref struct MemoryRegion abstract 
{ 
    virtual uint8_t Read(uint32_t address) = 0; 
    virtual void Write(uint32_t address, uint8_t value) = 0; 
    const uint32_t start_address, end_address; 
protected: 
    MemoryRegion(uint32_t start, uint32_t end) : start_address(start), end_address(end) {} 
}; 

ref struct SRAM : MemoryRegion 
{ 
    SRAM(uint32_t start, uint32_t end) : MemoryRegion(start, end) {} 
    virtual uint8_t Read(uint32_t address); 
    virtual void Write(uint32_t address, uint8_t value); 
}; 

ref struct RAM : MemoryRegion 
{ 
    RAM(uint32_t start, uint32_t end) : MemoryRegion(start, end) {} 
    virtual uint8_t Read(uint32_t address); 
    virtual void Write(uint32_t address, uint8_t value); 
}; 

ref struct VRAM : MemoryRegion 
{ 
    VRAM(uint32_t start, uint32_t end) : MemoryRegion(start, end) {} 
    virtual uint8_t Read(uint32_t address); 
    virtual void Write(uint32_t address, uint8_t value); 
}; 

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

array<MemoryRegion^>^ memories = gcnew array<MemoryRegion^>(10); 
memories[0] = gcnew SRAM(0xA000, 0xBFFF); 
// ... 
+1

позволяет надеяться, что функции-члены тоже статичны. – Anycorn

+0

@Anycorn: Да, структура, похоже, хранит обычный указатель на функцию, а не тип указателя на нестатический член. –

+0

Я думаю, что ОП использовал взломы, чтобы воссоздать ООП, используя C. Он, вероятно, не должен делать этого в C++, учитывая, что функции-члены уже присутствуют в lang. – Anycorn

Смежные вопросы