2016-03-25 33 views
-2

Bu soruya defalarca sorulur biliyorum, ancak sorunuma bağlayamıyorum.C hatası: tamamlayıcı türüne işaretçi işaretçisi, struct

Sorunum İşte

benim arabası kod

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


Bu bir fonksiyonu

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; 
} 
yılında arabası kodudur olan yapılar bir web doldurarak bir ilgisi olduğunu

Yapı ağının şu şekilde nasıl göründüğü

cpu

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; 
}; 

talimat

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 yapı

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]; 

}; 

hepsinin yanlış Bilesin ki size

teşekkür neyi yanlış yapıyorum söyle bu başlangıç ​​functio N struct emu_cpu arasında

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

Muhtemelen sadece uygun başlık dosyasını #include etmedi ya da bir yere bir yanlış yazdınız #include bekçi ile kendinizi kandırdı. – tofro

+0

'struct emu_cpu' tanımınız' fpuInit' işlev tanımı noktasında görünmez. – AnT

+1

Tüm bunlarda fpu diye adlandırılan ** struct ** yoktur. –

cevap

1

Tanımınız fonksiyonu fpuInit tanımı noktasında görünür değildir. Bu nedenle, fpuInit tanımında struct emu_cpu tanımına yapılan tüm referanslar, yeni, eksik bir türün ileriye dönük beyanı olarak görülür.

struct emu_cpu, bir başlık dosyasında tanımlanmışsa, fpuInit tanımlayan dosyaya dahil edildiğinden emin olun.

+0

yup sadece bir '' include' içermiyordu '' include' – SSpoke

0

Anonim birlikleri sadece bir yapı ağacın ucunda izin verilir: Bir anonim (isimsiz) yapı veya birliktelik olabilir

d

a->b.c.d =

yılında

b ve c olamaz ve isimleri olması gerekir.

Referans: ** Are "anonymous structs" standard? And, really, what *are* they? **

+0

“Anonim yapı” teriminin anlamını yanlış anladığınızı sanıyorum. OP'nin kodunda tek bir anonim yapı yoktur. Birkaç isimsiz birlik görüyorum ama isimsiz bir yapı yok. – AnT