2011-08-10 30 views
5

Một lần nữa hôm nay với gõ lại ..con trỏ đến hàm, cấu trúc như tham số

Trong cấu trúc là con trỏ hàm, trong đó tôi muốn có thể làm việc với dữ liệu từ cấu trúc này, do đó con trỏ đến cấu trúc được đưa ra làm tham số.

Demo của vấn đề này

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

struct tMYSTRUCTURE; 

typedef struct{ 
    int myint; 
    void (* pCallback)(struct tMYSTRUCTURE *mystructure); 
}tMYSTRUCTURE; 


void hello(struct tMYSTRUCTURE *mystructure){ 
    puts("!!!Hello World!!!"); /* prints !!!Hello World!!! */ 
} 

int main(void) { 
    tMYSTRUCTURE mystruct; 
    mystruct.pCallback = hello; 

    mystruct.pCallback(&mystruct); 
    return EXIT_SUCCESS; 

} 

Nhưng tôi nhận được cảnh báo

.. \ src \ retyping.c: 31: 5: cảnh báo: truyền tham số 1 của 'mystruct.pCallback' từ loại con trỏ không tương thích .. \ src \ retyping.c: 31: 5: lưu ý: dự kiến ​​'struct tMYSTRUCTURE *' nhưng đối số thuộc loại 'struct tMYSTRUCTURE *'

dự kiến ​​'struct tMYSTRUCTURE *' nhưng là 'struct tMYSTRUCTURE *', vui nhộn!

bất kỳ ý tưởng nào để khắc phục sự cố?

+1

Trong mã của bạn, không có thứ gì như 'struct tMYSTRUCTURE' **, đó là loại không đầy đủ. Tất cả những gì bạn có là một cấu trúc * ẩn danh * cũng xảy ra được gõ vào 'tMYSTRUCTURE'. Xem http://stackoverflow.com/questions/612328/difference-between-struct-and-typedef-struct-in-c/612350#612350. –

Trả lời

5

Sự cố đang được gây ra bởi cấu trúc typedef và sau đó sử dụng từ khóa struct cùng với tên typedef 'd. Chuyển tiếp tuyên bố cả hai structtypedef khắc phục sự cố.

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

struct tagMYSTRUCTURE; 
typedef struct tagMYSTRUCTURE tMYSTRUCTURE; 

struct tagMYSTRUCTURE { 
    int myint; 
    void (* pCallback)(tMYSTRUCTURE *mystructure); 
}; 


void hello(tMYSTRUCTURE *mystructure){ 
    puts("!!!Hello World!!!"); /* prints !!!Hello World!!! */ 
} 

int main(void) { 
    tMYSTRUCTURE mystruct; 
    mystruct.pCallback = hello; 

    mystruct.pCallback(&mystruct); 
    return EXIT_SUCCESS; 

} 
2

đang Corrected:

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

struct tMYSTRUCTURE_; 

typedef struct tMYSTRUCTURE_ { 
    int myint; 
    void (* pCallback)(struct tMYSTRUCTURE_ *mystructure); 
} tMYSTRUCTURE; 


void hello(tMYSTRUCTURE *mystructure){ 
    puts("!!!Hello World!!!"); /* prints !!!Hello World!!! */ 
} 

int main(void) { 
    tMYSTRUCTURE mystruct; 
    mystruct.pCallback = hello; 

    mystruct.pCallback(&mystruct); 
    return EXIT_SUCCESS; 

} 

Lưu ý sự khác biệt giữa struct tên và typedef tên. Có, bạn có thể làm cho họ giống nhau, nhưng nhiều người (bao gồm cả bản thân mình) thấy rằng khó hiểu ... Thực tế phổ biến là để giữ cho chúng khác biệt.

Phải thừa nhận rằng, chẩn đoán của GCC ở đây có nhiều hơn một chút kỳ quái.

Các vấn đề liên quan