2016-03-25 6 views
-2

Я знаю, что этот вопрос задан много раз, но я не могу связать его с моей проблемой.Ошибка C: указатель разыменования на неполный тип, struct

Моя проблема в том, что-то делать с заполнением полотна структур

Вот мой глючный код

src\fpu.c:17:7: error: dereferencing pointer to incomplete type 
    cpu->instr.fpu.control = 0x37F; 
    ^


Это код ошибки в функции

void fpuInit(struct emu_cpu *cpu) { 
    cpu->instr.fpu.control = 0x37F; 
    cpu->instr.fpu.status = 0; 
    cpu->instr.fpu.tag = 0xFFFF; 
    cpu->instr.fpu.lastDataPointer = 0; 
    cpu->instr.fpu.lastDataSeg = 0; 
    cpu->instr.fpu.lastIP = 0; 
    cpu->instr.fpu.lastIPseg = 0; 
    cpu->instr.fpu.opcode = 0; 
} 

Вот как выглядит структура веб-сайта

процессор

struct emu_cpu 
{ 
    struct emu *emu; 
    struct emu_memory *mem; 

    uint32_t debugflags; 

    uint32_t eip; 
    uint32_t eflags; 
    uint32_t reg[8]; 
    uint16_t *reg16[8]; 
    uint8_t *reg8[8]; 

    struct emu_instruction   instr; 
    struct emu_cpu_instruction_info  *cpu_instr_info; 

    uint32_t last_fpu_instr[2]; 

    char *instr_string; 

    bool repeat_current_instr; 

    struct emu_track_and_source *tracking; 
}; 

инструкция

struct emu_instruction 
{ 
    uint16_t prefixes; 
    uint8_t opcode; 
    uint8_t is_fpu : 1; 

    union 
    { 
     struct emu_cpu_instruction cpu; 
     struct emu_fpu_instruction fpu; 
    }; 

    struct 
    { 
     struct emu_tracking_info init; 
     struct emu_tracking_info need;  
    } track; 

    struct 
    { 
     uint8_t has_cond_pos : 1; 
     uint32_t norm_pos; 
     uint32_t cond_pos; 
    } source; 
}; 

FPU структура

union FpuMmxRegister { 
    long double fp; 
    unsigned char b[10]; //only use 8 of these for mmx 
    unsigned short s[4]; 
    unsigned int i[2]; 
    unsigned long long ll; 
}; 

struct emu_fpu_instruction 
{ 
    uint16_t prefixes; 

    uint8_t fpu_opcode; 
    //uint8_t fpu_modrm; 

    struct /* mod r/m data */ 
    { 
     union 
     { 
      uint8_t mod : 2; 
      uint8_t x : 2; 
     }; 

     union 
     { 
      uint8_t reg1 : 3; 
      uint8_t opcode : 3; 
      uint8_t sreg3 : 3; 
      uint8_t y : 3; 
     }; 

     union 
     { 
      uint8_t reg : 3; 
      uint8_t reg2 : 3; 
      uint8_t rm : 3; 
      uint8_t z : 3; 
     }; 

     struct 
     { 
      uint8_t scale : 2; 
      uint8_t index : 3; 
      uint8_t base : 3; 
     } sib; 

     union 
     { 
      uint8_t s8; 
      uint16_t s16; 
      uint32_t s32; 
     } disp; 

     uint32_t ea; 
    } fpu_modrm; 

    //uint32_t ea; 

    uint16_t control; 
    uint16_t status; 
    uint16_t tag; 
    uint32_t lastIP; 
    uint32_t lastIPseg; 
    uint32_t lastDataPointer; 
    uint32_t lastDataSeg; 
    uint16_t opcode; 

    uint32_t last_instr; 

    union FpuMmxRegister r[8]; 

}; 

Скажи мне, что я делаю неправильно спасибо

Точно так же вы знаете, что они все неправильно в этой начальной функции п

src\fpu.c:17:7: error: dereferencing pointer to incomplete type 
    cpu->instr.fpu.control = 0x37F; 
    ^
src\fpu.c:18:7: error: dereferencing pointer to incomplete type 
    cpu->instr.fpu.status = 0; 
    ^
src\fpu.c:19:7: error: dereferencing pointer to incomplete type 
    cpu->instr.fpu.tag = 0xFFFF; 
    ^
src\fpu.c:20:7: error: dereferencing pointer to incomplete type 
    cpu->instr.fpu.lastDataPointer = 0; 
    ^
src\fpu.c:21:7: error: dereferencing pointer to incomplete type 
    cpu->instr.fpu.lastDataSeg = 0; 
    ^
src\fpu.c:22:7: error: dereferencing pointer to incomplete type 
    cpu->instr.fpu.lastIP = 0; 
    ^
src\fpu.c:23:7: error: dereferencing pointer to incomplete type 
    cpu->instr.fpu.lastIPseg = 0; 
    ^
src\fpu.c:24:7: error: dereferencing pointer to incomplete type 
    cpu->instr.fpu.opcode = 0; 
    ^
+0

Вы, вероятно, просто не #include соответствующий файл заголовка или обманут себя с неправильно набран #include охранником где-то. – tofro

+0

Ваше определение 'struct emu_cpu' не отображается в точке определения функции' fpuInit'. – AnT

+1

Во всем этом нет ** struct **, называемого fpu. –

ответ

1

Ваше определение struct emu_cpu не видно в точке определения функции fpuInit. По этой причине все ссылки на struct emu_cpu в определении fpuInit рассматриваются как передовые декларации нового, неполного типа.

Если ваш struct emu_cpu определен в файле заголовка, убедитесь, что он включен в файл, который определяет fpuInit.

+0

yup, это было просто отсутствующее' # include' – SSpoke

0

анонимные объединения разрешается только в конце структуры дерева:

В

a->b.c.d =

д может быть анонимный (без имени) структуры или объединения,

b и c не могут и должны иметь имена.

Ссылка: ** Are "anonymous structs" standard? And, really, what *are* they? **

+0

Я подозреваю, что вы неправильно поняли смысл термина «анонимная структура». В коде OP нет ни одной анонимной структуры. Я вижу пару анонимных союзов, но никаких анонимных структур. – AnT

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