Ceci est mon premier message, alors s'il vous plaît soyez doux.Déclaration, attribution et affectation d'un tableau de pointeurs aux pointeurs de fonction
J'ai joué avec C de temps en temps dans le passé. Maintenant je suis arrivé au point où j'ai démarré un vrai projet (un moteur graphique 2D utilisant SDL, mais ce n'est pas pertinent pour la question), pour pouvoir dire que j'ai une réelle expérience du C. Hier, en travaillant sur le système d'événements, j'ai rencontré un problème que je ne pouvais pas résoudre.
Il y a cette typedef,
//the void parameter is really an SDL_Event*.
//but that is irrelevant for this question.
typedef void (*event_callback)(void);
qui spécifie la signature d'une fonction à appeler sur les événements du moteur. Je veux être capable de supporter plusieurs event_callbacks, donc un tableau de ces callbacks serait une idée, mais je ne veux pas limiter le nombre de callbacks, donc j'ai besoin d'une sorte d'allocation dynamique. C'est là que le problème s'est posé. Ma première tentative est allé comme ceci:
//initial size of callback vector
static const int initial_vecsize = 32;
//our event callback vector
static event_callback* vec = 0;
//size
static unsigned int vecsize = 0;
void register_event_callback(event_callback func) {
if (!vec)
__engine_allocate_vec(vec);
vec[vecsize++] = func; //error here!
}
static void __engine_allocate_vec(engine_callback* vec) {
vec = (engine_callback*) malloc(sizeof(engine_callback*) * initial_vecsize);
}
Tout d'abord, j'ai omis une erreur de vérification ainsi que le code qui réaffecte le vecteur de rappel lorsque le nombre de callbacks dépasse la taille du vecteur. Toutefois, lorsque j'exécute ce code, le programme se bloque comme décrit dans le code. Je devine le défaut de segmentation mais je ne peux pas être sûr puisque aucune sortie n'est donnée. Je suppose également que l'erreur provient d'une compréhension quelque peu erronée sur la façon de déclarer et d'allouer un tableau de pointeurs à des pointeurs de fonction.
S'il vous plaît Stack Overflow, guide moi.
EDIT: Je n'arrive pas à comprendre comment mettre en retrait les blocs de code. C'est presque un peu embarrassant ...
EDIT: Ne l'oubliez pas. Vérifié la source de la page de certains autres messages =).
Vous avez indenter le code de 4 espaces pour qu'il soit formaté correctement. – Artefacto
Utilisez le bouton '101010' sur la page d'édition pour transformer le texte marqué en code. – sbi
Vous avez besoin d'une double indirection dans __engine_allocate_vec – Artefacto