Tôi đang thực hiện một trò chơi bài trong C. Có rất nhiều loại thẻ và mỗi loại có một loạt thông tin, bao gồm một số hành động cần phải được viết riêng lẻ liên kết với nó.Khởi tạo Static Array of Structs trong C
Cho một struct như thế này (và tôi không chắc chắn tôi phải đúng cú pháp cho các con trỏ hàm)
struct CARD {
int value;
int cost;
// This is a pointer to a function that carries out actions unique
// to this card
int (*do_actions) (struct GAME_STATE *state, int choice1, int choice2);
};
Tôi muốn khởi tạo một mảng tĩnh trong số này, một cho mỗi thẻ. Tôi đoán điều này sẽ giống như thế này
int do_card0(struct GAME_STATE *state, int choice1, int choice2)
{
// Operate on state here
}
int do_card1(struct GAME_STATE *state, int choice1, int choice2)
{
// Operate on state here
}
extern static struct cardDefinitions[] = {
{0, 1, do_card0},
{1, 3, do_card1}
};
Sẽ làm việc này, và tôi sẽ về vấn đề này một cách đúng đắn ở tất cả? Tôi đang cố gắng tránh số lượng lớn các câu lệnh chuyển đổi.
Tôi có cần định nghĩa các hàm 'do_cardN' trước hay không, hoặc có cách nào đó để xác định nội tuyến trong khởi tạo cấu trúc (ví dụ như hàm lambda trong python) không?
Tôi cần quyền truy cập chỉ đọc vào thẻDefinitions từ một tệp khác - là 'extern static' có đúng không?
Tôi biết đây là rất nhiều câu hỏi được cuộn thành một nhưng tôi thực sự mơ hồ về cách thực hiện điều này.
Cảm ơn.
Edit:
Để được rõ ràng, mục tiêu của tôi là để có thể làm điều gì đó như
int cost = cardDefinitions[cardNumber].cost;
hoặc
int result = cardDefinitions[cardNumber].do_action(state, choice1, choice2);
Thay vì sử dụng báo cáo chuyển đổi rất lớn ở khắp mọi nơi.
Bạn có thể có các hàm "nội tuyến" trong C. Từ bạn đang tìm kiếm là "các hàm ẩn danh". Hơn nữa, tôi sẽ thêm {0, 0, NULL} làm phần tử cuối cùng của mảng, do đó bạn không cần phải lưu trữ kích thước của nó một cách riêng biệt. – Philip
@Philip Vâng, những "nội tuyến" đó hoàn toàn không liên quan đến những gì anh ấy nói, nhưng có, bạn nói đúng. Và tôi thích "sizeof (cardDefinitions)/sizeof (cardDefinitions [0])" lừa cho các trường hợp như thế này –
@Michael: Thủ thuật này không hoạt động nếu bạn khai báo "extern struct CARDDefinitions [];". – Philip