2009-10-08 6 views
1

J'ai la fonction suivante avec seulement une liste de paramètres variables (Sans argument support/fixe). Est-il possible d'obtenir des valeurs passées à cette fonction? J'utilise le format ANSI.Comment obtenir des données à partir d'une liste de paramètres variables?

Foo(...) 
{ 
} 

Ajout de quelques points pour plus de clarté. Dans mon cas particulier, le nombre d'arguments et leurs types sont stockés dans un fichier .xml en tant que configurations accessibles depuis Foo().

Edit:

J'ajoute des informations de mon tâtonnement. J'ai partiellement réussi à obtenir des données de la liste comme suit. L'idée que je mets derrière cela est de lire directement les données de la pile. Ici, le facteur de problème est Offset dont la valeur varie en fonction du nombre d'arguments que je passe dans Foo(). Par exemple, quand je passe seulement un pointeur, je mets sa valeur à 16 pour obtenir le résultat correct. J'ai trouvé ces valeurs avec essais et erreurs. Je souhaite dériver Offset de la liste de paramètres que mon programme peut exécuter sans échec d'exécution dans tous les cas possibles. Quelqu'un peut-il me dire la relation entre ce Offset et la liste des paramètres. J'utilise Visual Studio 2008 pour développer ceci.

Répondre

2

Les fonctions variables sans arguments fixes ne sont pas prises en charge dans le langage C moderne. Toutefois, pour des raisons de compatibilité ascendante, elles sont prises en charge par varargs.h. Voir aussi this man page, qui fournit l'exemple de code suivant. Notez la définition de fonction de style R K & requise par varargs.

#include <varargs.h> 
void foo(va_alist) va_dcl { 
    va_list ap; 
    va_start(ap); 
    while(...) { 
     ... 
     x = va_arg(ap, type); 
     ... 
    } 
    va_end(ap); 
} 
1

Les fonctions variadiques nécessitent des arguments fixes dans le langage C moderne, car les fonctions doivent pouvoir trier les actions à effectuer. Par exemple, printf() sait quels arguments extraire de la pile en fonction de la chaîne de format. Si vous omettez ces paramètres fixes, il n'y a pas de vérification de l'exactitude des arguments.

Si Foo() effectue une recherche quelconque, il serait logique de passer soit une référence xml soit les valeurs à rechercher en tant que paramètre (ou mieux: les deux).

Retour à K & R style C est assez méchant. Peut-être que vous pouvez changer le fractionnement entre l'analyseur et l'interpréteur Foo() pour utiliser une interface plus claire.

+0

Merci; En fait, je ne suis pas à la recherche de quelque chose à passer parce que je devrais passer quelque chose. J'essaye de le résoudre sans ajouter aucune redondance ou information factice. – Vadakkumpadath

+0

Si votre fonction a besoin de données globales (comme une référence xml), il me semble logique de l'utiliser (ceci ne serait pas redondant, mais améliorerait le couplage (inférieur) au sein de votre programme. – Adriaan

Questions connexes