OVH Cloud OVH Cloud

va_list dynamique

5 réponses
Avatar
olivier
Bonjour,

J'aurais besoin de faire le code suivant:

============ DEBUT ==============
DOMNode *nodeCurrent = getRootNode();


DOMNode * Parser::getElement1(string element, ...)
{
// comment passer ici les arguments variables recus
//en entree de la methode!!!
return this->getElement2(element, nodeCurrent, ??????);
}

DOMNode * Parser::getElement2(string element, DOMNode* node, ...)
{
cout << "ok" << endl;
}

============ FIN ==============

va_list permettrait de recuperer tous les elements passes a getElement1,
mais quelle syntaxe utiliser alors pour passer un nombre d'argument
dynamique a getElement2?

Merci d'avance.
Cordialement,
Olivier.

5 réponses

Avatar
olivier
Je pourrais m'en sortir avec un vector mais j'aimerais
bien savoir si c'est tout de même faisable avec des arguments variables
(je me rends compte que je devrais peut-être plutôt poster dans le forum C)

Merci.
Cordialement,
Olivier



olivier wrote:
Bonjour,

J'aurais besoin de faire le code suivant:

============ DEBUT ============= > DOMNode *nodeCurrent = getRootNode();


DOMNode * Parser::getElement1(string element, ...)
{
// comment passer ici les arguments variables recus
//en entree de la methode!!!
return this->getElement2(element, nodeCurrent, ??????);
}

DOMNode * Parser::getElement2(string element, DOMNode* node, ...)
{
cout << "ok" << endl;
}

============ FIN ============= >
va_list permettrait de recuperer tous les elements passes a getElement1,
mais quelle syntaxe utiliser alors pour passer un nombre d'argument
dynamique a getElement2?

Merci d'avance.
Cordialement,
Olivier.


Avatar
kanze
olivier wrote:
Bonjour,

J'aurais besoin de faire le code suivant:

============ DEBUT ============= > DOMNode *nodeCurrent = getRootNode();


DOMNode * Parser::getElement1(string element, ...)
{
// comment passer ici les arguments variables recus
//en entree de la methode!!!
return this->getElement2(element, nodeCurrent, ??????);
}

DOMNode * Parser::getElement2(string element, DOMNode* node, ...)
{
cout << "ok" << endl;
}

============ FIN ============= >
va_list permettrait de recuperer tous les elements passes a
getElement1,

mais quelle syntaxe utiliser alors pour passer un nombre d'argument
dynamique a getElement2?

Merci d'avance.
Cordialement,
Olivier.


Avatar
kanze
olivier wrote:

J'aurais besoin de faire le code suivant:

============ DEBUT ========== ====
DOMNode *nodeCurrent = getRootNode();

DOMNode * Parser::getElement1(string element, ...)
{
// comment passer ici les arguments variables recus
//en entree de la methode!!!
return this->getElement2(element, nodeCurrent, ??????);
}

DOMNode * Parser::getElement2(string element, DOMNode* node, ...)
{
cout << "ok" << endl;
}

============ FIN ========== ====

va_list permettrait de recuperer tous les elements passes a
getElement1, mais quelle syntaxe utiliser alors pour passer un
nombre d'argument dynamique a getElement2?


Je ne suis pas sûr quels paramètres exactement tu veux passer à
getElement2. Si c'est getElement2 qui doit évaluer tous les
paramètres dynamique, alors, tu peux lui passer le va_list, par
exemple :

DOMNode*
Parser::getElement1(
std::string element,
... )
{
// ...
va_list ap ;
va_start( ap, element ) ;
getElement2( element, nodeCurrent, ap ) ;
va_end( ap ) ;
}

DOMNode*
Parser::getElement2(
std::string element,
DOMNode* node,
va_list ap )
{
// ...
}

Si ce n'est qu'une partie de la liste qui t'intéresse, tu dois
pouvoir passer un pointeur ou une référence au va_list à
getElement2.

Fait gaffe, néaumoins. Le paramètre qui précède les ... ne peut
pas être une référence. Ni un certain nombre d'autres choses
(char, float, etc.). Et évidemment, les types qu'on peut
utiliser dans la liste ... sont très limités.

--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34

Avatar
olivier
Merci pour ta réponse.

Même en passant:
getElement2( element, nodeCurrent, ap )

Je suis plus ou moins bloqué car je passe alors des
types string ou DOMNode dans ap, puis dans getElement2
je ne sais pas comment me positionner après
(l'appel de va_arg(ap, DOMNode*) génère un core dump car
il ne semble pas pouvoir gérer les classes).

Enfin bref, je me suis donc rabattu sur un vector<string> ap.
L'utilisation est plus lourde mais au moins ca marche!

Merci.
Olivier.


wrote:
olivier wrote:


J'aurais besoin de faire le code suivant:



============ DEBUT ============= >>DOMNode *nodeCurrent = getRootNode();



DOMNode * Parser::getElement1(string element, ...)
{
// comment passer ici les arguments variables recus
//en entree de la methode!!!
return this->getElement2(element, nodeCurrent, ??????);
}



DOMNode * Parser::getElement2(string element, DOMNode* node, ...)
{
cout << "ok" << endl;
}



============ FIN ============= >

va_list permettrait de recuperer tous les elements passes a
getElement1, mais quelle syntaxe utiliser alors pour passer un
nombre d'argument dynamique a getElement2?



Je ne suis pas sûr quels paramètres exactement tu veux passer à
getElement2. Si c'est getElement2 qui doit évaluer tous les
paramètres dynamique, alors, tu peux lui passer le va_list, par
exemple :

DOMNode*
Parser::getElement1(
std::string element,
... )
{
// ...
va_list ap ;
va_start( ap, element ) ;
getElement2( element, nodeCurrent, ap ) ;
va_end( ap ) ;
}

DOMNode*
Parser::getElement2(
std::string element,
DOMNode* node,
va_list ap )
{
// ...
}

Si ce n'est qu'une partie de la liste qui t'intéresse, tu dois
pouvoir passer un pointeur ou une référence au va_list à
getElement2.

Fait gaffe, néaumoins. Le paramètre qui précède les ... ne peut
pas être une référence. Ni un certain nombre d'autres choses
(char, float, etc.). Et évidemment, les types qu'on peut
utiliser dans la liste ... sont très limités.

--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34




Avatar
Horst Kraemer
olivier wrote:

Merci pour ta réponse.

Même en passant:
getElement2( element, nodeCurrent, ap )

Je suis plus ou moins bloqué car je passe alors des
types string ou DOMNode dans ap, puis dans getElement2
je ne sais pas comment me positionner après
(l'appel de va_arg(ap, DOMNode*) génère un core dump car
il ne semble pas pouvoir gérer les classes).


Ce n'est pas la faute du DOMNode* parce que des pointeurs sont
toujours permis. C'est la faute des objets du type "string" parce que
la classe "string" est une classe "non-POD".

--
Horst

--
Lâche pas la patate!