Sto implementando un gioco di carte in C. Ci sono molti tipi di carte e ognuna ha un mucchio di informazioni, incluse alcune azioni che dovranno essere associate a script individuali.Inizializza matrice statica di strutture in C
dato una struct come questo (e io non sono certo ho il diritto sintassi per il puntatore a funzione)
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);
};
vorrei inizializzare un array statico di questi, uno per ogni carta. Sto indovinando questo sarebbe simile a questa
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}
};
- Sarà
questo lavoro, e sto andare su questo nel modo giusto a tutti? Sto cercando di evitare un numero enorme di istruzioni switch.
Devo definire le funzioni 'do_cardN' prima del tempo, o c'è un modo per definirle in linea nell'inizializzazione della struct (qualcosa come una funzione lambda in python)?
Avrò bisogno di accesso in sola lettura a cardDefinitions da un file diverso - è "extern static" corretto per quello?
So che si tratta di un sacco di domande, ma sono davvero un po 'vago su come procedere.
Grazie.
Edit:
Per essere chiari, il mio obiettivo è quello di essere in grado di fare qualcosa di simile
int cost = cardDefinitions[cardNumber].cost;
o
int result = cardDefinitions[cardNumber].do_action(state, choice1, choice2);
Invece di utilizzare enormi istruzioni switch in tutto il luogo.
Si può effettivamente avere funzioni "inline" in C. La parola che stai cercando è "funzioni anonime". Inoltre, aggiungerei {0, 0, NULL} come ultimo elemento dell'array, quindi non è necessario memorizzarne le dimensioni separatamente. – Philip
@ Philip Bene, quelle "inline" sono del tutto estranee a ciò di cui sta parlando, ma sì, hai ragione. E io preferisco il "sizeof (cardDefinitions)/sizeof (cardDefinitions [0])" trucco per casi come questo –
@ Michael: Questo trucco non funziona se si dichiara "Esterno cardDefinitions struct Scheda [];". – Philip