Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Necessite d'utiliser l'argument sur la pile

17 réponses
Avatar
noirel
Bonjour,

Si une fonction est définie pour recevoir un nombre variable
d'arguments, est-elle obligée d'utiliser tous ses arguments ?
La raison de cette question est que dans une telle fonction l'argument
peut ne pas servir effectivement dans certaines conditions.

int fonction ( const unsigned int entier, ... )
{
/* ... */
switch ( entier ) {
case FOO:
if ( ... ) {
/* Faire quelque chose avec va_arg ( ... ) */
} else {
unsigned int junk = va_arg ( ... ); /* Est-ce nécessaire ? */
fprintf ( stderr, "No more room...\n" );
/* ... */
}
}
/* ... */
}

La ligne

unsigned int junk = va_arg ( ... );

est-elle nécessaire ?

--
Joss

10 réponses

1 2
Avatar
DINH Viêt Hoà

Si une fonction est définie pour recevoir un nombre variable
d'arguments, est-elle obligée d'utiliser tous ses arguments ?


à priori non, mais pourquoi poses-tu la question, as-tu essayé,
cela a-t-il marché ?

--
DINH V. Hoa,

"le vin c'est pas de l'alcool" -- MAB

Avatar
Anthony Fleury
Josselin Noirel wrote:

Bonjour,

Si une fonction est définie pour recevoir un nombre variable
d'arguments, est-elle obligée d'utiliser tous ses arguments ?
La raison de cette question est que dans une telle fonction l'argument
peut ne pas servir effectivement dans certaines conditions.


[ ... ]

La ligne

unsigned int junk = va_arg ( ... );

est-elle nécessaire ?



Il n'est pas obligatoire d'utiliser tous les arguments d'une fonctionn
normale, c'est la même chose pour les fonctions à nombre d'arguments
variable.
Mais pourquoi cette question ? un test a soulevé un bug dans ce cas ? Si
oui, quel est le code donnant ce comportement ?
Car je ne vois rien dans la norme qui l'obligerait, et même un test pour
lever les doutes sur mon implémentation ne m'a pas donné de problèmes
notables...

Anthony
--
It's a bird.. It's a plane..
No, it's KernelMan, faster than a speeding bullet, to your rescue.
Doing new kernel versions in under 5 seconds flat..
-- Linus, in the announcement for 1.3.27

Avatar
Emmanuel Delahaye
In 'fr.comp.lang.c', (Josselin Noirel) wrote:

Si une fonction est définie pour recevoir un nombre variable
d'arguments, est-elle obligée d'utiliser tous ses arguments ?


Non. Mais si ils sont utilisés, ils doivent l'être séquentiellement en
partant du plus à gauche.

--
-ed- get my email here: http://marreduspam.com/ad672570
The C-language FAQ: http://www.eskimo.com/~scs/C-faq/top.html
C-reference: http://www.dinkumware.com/manuals/reader.aspx?libÉ9
FAQ de f.c.l.c : http://www.isty-info.uvsq.fr/~rumeau/fclc/

Avatar
Emmanuel Delahaye
In 'fr.comp.lang.c', DINH =?iso-8859-15?Q?Viêt_Hoà?=
wrote:

Si une fonction est définie pour recevoir un nombre variable
d'arguments, est-elle obligée d'utiliser tous ses arguments ?


à priori non, mais pourquoi poses-tu la question, as-tu essayé,
cela a-t-il marché ?



Marche, marche pas, ça ne prouve rien...

http://mapage.noos.fr/emdel/init_c.htm#UB

--
-ed- get my email here: http://marreduspam.com/ad672570
The C-language FAQ: http://www.eskimo.com/~scs/C-faq/top.html
C-reference: http://www.dinkumware.com/manuals/reader.aspx?libÉ9
FAQ de f.c.l.c : http://www.isty-info.uvsq.fr/~rumeau/fclc/


Avatar
noirel
Anthony Fleury , a écrit ceci :
Il n'est pas obligatoire d'utiliser tous les arguments d'une fonctionn
normale, c'est la même chose pour les fonctions à nombre d'arguments
variable.


Bon, ben voilà, j'ai ma réponse. La différence que je _vois_ entre les
deux types de fonction c'est que la dernière nécessite d'aller chercher
explicitement ses arguments (je souligne « vois » parce que mes yeux ne
sont pas experts) et que n'allant pas les chercher je me demandais si ça
ne laissait pas le bazar d'une façon ou d'une autre (pour faire une
analogie fallacieuse, comme si on omettait de faire un wait()).

un test a soulevé un bug dans ce cas ?


Non, il faut, pour poser des questions ? ;-) Je préfère dans une
certaine mesure savoir ce que je fais. Je n'ai juste rien trouvé dans
la norme qui interdît ou autorisât l'« abandon » d'arguments. J'ai
choisi de ne pas me laisser aller à la facilité et de profiter de
l'occasion pour faire ma première apparition sur ce forum.

Car je ne vois rien dans la norme qui l'obligerait, et même un test pour
lever les doutes sur mon implémentation ne m'a pas donné de problèmes
notables...


La norme n'a pas répondu à mes questions donc je demande conseil ici
plutôt que d'attendre que ça buggue pour me manifester, parce que je
suis un peu suspicieux vis à vis de ce que je produis et lis la norme
avec autant de parcimonie que possible. :-)

--
Joss

Avatar
noirel
Emmanuel Delahaye , a écrit ceci :
Marche, marche pas, ça ne prouve rien...


Je suis bien d'accord. Merci à tous.

--
Joss

Avatar
Anthony Fleury
Josselin Noirel wrote:

Anthony Fleury , a écrit ceci :

un test a soulevé un bug dans ce cas ?


Non, il faut, pour poser des questions ? ;-) Je préfère dans une
certaine mesure savoir ce que je fais. Je n'ai juste rien trouvé dans
la norme qui interdît ou autorisât l'« abandon » d'arguments. J'ai
choisi de ne pas me laisser aller à la facilité et de profiter de
l'occasion pour faire ma première apparition sur ce forum.



Ce n'est pas obligatoire d'avoir des problèmes en effet pour se poser la
question et c'est même une très bonne habitude que de savoir ce que l'on
fait, mais la question m'a un peu étonné donc j'ai demandé dans quelle
contexte elle se posait :-)

Car je ne vois rien dans la norme qui l'obligerait, et même un test pour
lever les doutes sur mon implémentation ne m'a pas donné de problèmes
notables...


La norme n'a pas répondu à mes questions donc je demande conseil ici
plutôt que d'attendre que ça buggue pour me manifester, parce que je
suis un peu suspicieux vis à vis de ce que je produis et lis la norme
avec autant de parcimonie que possible. :-)



Ah si tout le monde faisait pareil... !!

Anthony
--
It's a bird.. It's a plane..
No, it's KernelMan, faster than a speeding bullet, to your rescue.
Doing new kernel versions in under 5 seconds flat..
-- Linus, in the announcement for 1.3.27


Avatar
DINH Viêt Hoà

Ce n'est pas obligatoire d'avoir des problèmes en effet pour se poser la
question et c'est même une très bonne habitude que de savoir ce que l'on
fait, mais la question m'a un peu étonné donc j'ai demandé dans quelle
contexte elle se posait :-)


de même, c'était le sens de mes propos même si ça n'avait pas l'air.
Naturellement, pour garder la même sémantique que dans les appels
de fonction à nombre d'arguments fixes, j'aurai supposé que ce ne soit
pas une obligation de tous les référencer au moins une fois.

Ah si tout le monde faisait pareil... !!


:)

--
DINH V. Hoa,

"le vin c'est pas de l'alcool" -- MAB

Avatar
Emmanuel Delahaye
In 'fr.comp.lang.c', (Josselin Noirel) wrote:

La norme n'a pas répondu à mes questions donc je demande conseil ici
plutôt que d'attendre que ça buggue pour me manifester, parce que je
suis un peu suspicieux vis à vis de ce que je produis et lis la norme
avec autant de parcimonie que possible. :-)


Pourtant, la lecture de la norme mérite plus que de la parcimonie.

A mois qu'il y ait un problème de vocabulaire, et que tu veuilles dire 'avec
autant d'attention' ou 'autant de précision'.

http://atilf.atilf.fr/Dendien/scripts/tlfiv5/affart.exe?19;s0441330;?b=0;

--
-ed- get my email here: http://marreduspam.com/ad672570
The C-language FAQ: http://www.eskimo.com/~scs/C-faq/top.html
C-reference: http://www.dinkumware.com/manuals/reader.aspx?libÉ9
FAQ de f.c.l.c : http://www.isty-info.uvsq.fr/~rumeau/fclc/

Avatar
Horst Kraemer
On 30 May 2004 17:04:06 GMT, Emmanuel Delahaye
wrote:

In 'fr.comp.lang.c', (Josselin Noirel) wrote:

Si une fonction est définie pour recevoir un nombre variable
d'arguments, est-elle obligée d'utiliser tous ses arguments ?


Non. Mais si ils sont utilisés, ils doivent l'être séquentiellement en
partant du plus à gauche.


void f(int n, ...)
{
int i1,i2;
va_list ap;

va_start(ap,n);
(void)va_arg(ap,int);
i2=va_arg(ap,int);
va_end(ap);

va_start(ap);
i1=va_arg(ap,int);
va_end(ap);
}

scnr

Y a-t-il une facon illégale d'utiliser les arguments non
séquentiellement ?

--
Horst


1 2