2012-09-12 2 views
0

J'ai une API d'arbres traversal qui ressemble à ceciarguments variables pour les fonctions de rappel

treeTraverse(Tree *ptr, (void *) call_back(Tree *ptr)); 

Cette API traverse l'arbre et appelle la fonction de rappel à chaque entrée. Je veux traverser l'arbre et appeler une fonction

myFunc(Tree *ptr, int a, int b) 

pour chaque entrée sur l'arbre, mais comme vous pouvez le voir ci-dessus la fonction de rappel accepte un seul argument, si l'enregistrement myFunc() que la fonction de rappel wont travail. Comment puis-je contourner ce problème. Réécrire l'API treeTraverse() pour accepter les arguments variables n'est pas réalisable, car il s'agit d'une API de structure et si je dois la changer, je devrai la faire réviser par beaucoup de gens. Ce n'est pas quelque chose que j'attends avec impatience car j'ai seulement besoin de mettre en œuvre une très petite fonctionnalité.

Une autre manière serait de rendre les variables 'a' & 'b' globales, donc myFunc peut y accéder. mais cette solution a l'air très moche.

Existe-t-il un autre moyen de contourner ce problème?

+0

pouvez-vous ajouter une fonction treeTraverseWithParms à l'API? – Kwariz

+0

Les variables globales avec liaison interne doivent être OK (bien qu'elles aient une durée de vie statique, ce qui peut poser un problème lorsque plusieurs entiers sont nécessaires pour une tâche mineure). Votre "API" ressemble plus à une déclaration d'appel de fonction qu'à un déclarateur de fonction. –

+0

Cette erreur ne peut pas être compilée: spécification de déclaration attendue ou '...' avant '(' token ' – fork0

Répondre

2

Faire a et b global semble être une solution raisonnable, étant donné votre situation. Soyez prudent, cependant, ce n'est pas thread ou récursif.

Si vous pouvez ajouter un seul argument supplémentaire pour treeTraverse qui est passée au rappel, alors vous pouvez passer un nombre arbitraire d'arguments supplémentaires à l'aide d'une struct:

void treeTraverse(Tree *ptr, 
        (void *) call_back(Tree *ptr, void *arg), 
        void *call_back_arg); 
struct { 
    int a; 
    int b; 
} args = {...}; 
treeTraverse(ptr, myCallback, &args); 

Ceci est une caractéristique standard de la plupart code qui utilise des rappels. Vous devriez insister pour qu'il soit ajouté à votre API de framework, c'est une bien meilleure solution.

+0

Merci pour la suggestion. Je dois vraiment changer, je suis trop paresseux pour passer par le processus :) – Pratt

Questions connexes