OVH Cloud OVH Cloud

return dans un switch case

90 réponses
Avatar
Albert
Bonjour a tous,
Mon probleme est dans le titre.
J'ai un switch case et a l'interieur est il "permis" de sortir d'un
case par un return ( le switch case est bien sur dans une fonction)
A la compile ( gcc (GCC) 3.2.2 20030222 (Red Hat Linux 3.2.2-5))
je n'ai aucun message d'avertissement. Mais je voudrais etre sur que
c'est correcte. Rien vu a ce sujet.
Merci de vos reponses.
gil

10 réponses

1 2 3 4 5
Avatar
Targeur fou
Albert wrote:
Bonjour a tous,


Bonjour,

Mon probleme est dans le titre.
J'ai un switch case et a l'interieur est il "permis" de sortir d'un
case par un return ( le switch case est bien sur dans une fonction)
A la compile ( gcc (GCC) 3.2.2 20030222 (Red Hat Linux 3.2.2-5))
je n'ai aucun message d'avertissement. Mais je voudrais etre sur que
c'est correcte. Rien vu a ce sujet.


Oui oui c'est correct. Ceci dit, si il n'y a pas masse de code dans la
fonction après le bloc switch, ce n'est pas très joli.
Voir §6.8.6.4 de la norme (ou d'un brouillon) C99.

A+
Regis

Avatar
Pierre Maurette
Albert wrote:
Bonjour a tous,


Bonjour,

Mon probleme est dans le titre.
J'ai un switch case et a l'interieur est il "permis" de sortir d'un
case par un return ( le switch case est bien sur dans une fonction)
A la compile ( gcc (GCC) 3.2.2 20030222 (Red Hat Linux 3.2.2-5))
je n'ai aucun message d'avertissement. Mais je voudrais etre sur que
c'est correcte. Rien vu a ce sujet.


Oui oui c'est correct. Ceci dit, si il n'y a pas masse de code dans la
fonction après le bloc switch, ce n'est pas très joli.
Voir §6.8.6.4 de la norme (ou d'un brouillon) C99.
<§6.8.6.4.2>

Semantics
2 A return statement terminates execution of the current function and
returns control to its caller. A function may have any number of return
statements.
</§6.8.6.4.2>

A moins d'avoir une raison particulière pour un seul return par
fonction (par exemple des outils de vérification ou de débogage que je
ne connais pas), et dans le cas classique d'un fonction réduite à
d'éventuels inits suivis d'un vaste switch, ça me semble la meilleure
solution même sur le plan du style.

--
Pierre Maurette


Avatar
Targeur fou
Pierre Maurette wrote:

Bonjour,

Albert wrote:
Bonjour a tous,


Bonjour,

Mon probleme est dans le titre.
J'ai un switch case et a l'interieur est il "permis" de sortir d'un
case par un return ( le switch case est bien sur dans une fonction)
A la compile ( gcc (GCC) 3.2.2 20030222 (Red Hat Linux 3.2.2-5))
je n'ai aucun message d'avertissement. Mais je voudrais etre sur que
c'est correcte. Rien vu a ce sujet.


Oui oui c'est correct. Ceci dit, si il n'y a pas masse de code dans la
fonction après le bloc switch, ce n'est pas très joli.
Voir §6.8.6.4 de la norme (ou d'un brouillon) C99.
<§6.8.6.4.2>

Semantics
2 A return statement terminates execution of the current function and
returns control to its caller. A function may have any number of return
statements.
</§6.8.6.4.2>

A moins d'avoir une raison particulière pour un seul return par
fonction (par exemple des outils de vérification ou de débogage que je
ne connais pas), et dans le cas classique d'un fonction réduite à
d'éventuels inits suivis d'un vaste switch, ça me semble la meilleure
solution même sur le plan du style.


Pour ce cas précis d'inits suivies d'un vaste switch et de petites
fonctions, peut-être, mais en général je ne suis pas d'accord. Il
suffit d'une allocation faite quelquepart, puis 500 lignes plus bas un
switch avec un return dans lequel on a oublié de désallouer ce qui
l'était avant de partir, et c'est la fête des fuites mémoires si la
fonction est appelée souvent.
Sur le plan du style, je trouve moche d'avoir 36 points de retour, et
je pense qu'un return dans un case peut faire cogiter le programmeur un
petit bout de temps si la fonction englobante est volumineuse.

A+
Regis



Avatar
Pierre Maurette
Pierre Maurette wrote:

Bonjour,

Albert wrote:
Bonjour a tous,


Bonjour,

Mon probleme est dans le titre.
J'ai un switch case et a l'interieur est il "permis" de sortir d'un
case par un return ( le switch case est bien sur dans une fonction)
A la compile ( gcc (GCC) 3.2.2 20030222 (Red Hat Linux 3.2.2-5))
je n'ai aucun message d'avertissement. Mais je voudrais etre sur que
c'est correcte. Rien vu a ce sujet.


Oui oui c'est correct. Ceci dit, si il n'y a pas masse de code dans la
fonction après le bloc switch, ce n'est pas très joli.
Voir §6.8.6.4 de la norme (ou d'un brouillon) C99.
<§6.8.6.4.2>

Semantics
2 A return statement terminates execution of the current function and
returns control to its caller. A function may have any number of return
statements.
</§6.8.6.4.2>

A moins d'avoir une raison particulière pour un seul return par
fonction (par exemple des outils de vérification ou de débogage que je
ne connais pas), et dans le cas classique d'un fonction réduite à
d'éventuels inits suivis d'un vaste switch, ça me semble la meilleure
solution même sur le plan du style.


Pour ce cas précis d'inits suivies d'un vaste switch et de petites
fonctions, peut-être, mais en général je ne suis pas d'accord. Il
suffit d'une allocation faite quelquepart, puis 500 lignes plus bas un
switch avec un return dans lequel on a oublié de désallouer ce qui
l'était avant de partir, et c'est la fête des fuites mémoires si la
fonction est appelée souvent.
Sur le plan du style, je trouve moche d'avoir 36 points de retour, et
je pense qu'un return dans un case peut faire cogiter le programmeur un
petit bout de temps si la fonction englobante est volumineuse.
Nous voilà partis dans l'interminable ;-)

Le contre-exemple de l'exemple, les trucs immondes où on alloue
n'importe où et où tout à coup on est devenu nullissime. Puis viendront
les machines improbables, les exemples vécus, les fusées qui tombent,
et j'en passe.
Je me positionne dans le cas où les multiples return s'imposent
logiquement bien entendu, et je considère que le programmeur est
capable de structurer son code, y compris au niveau du style. Bien
entendu, si un seul case n'aboutit pas à return, c'est différent. Dans
ces conditions, je vois mal la supériorité de 36:

retour = qqchose;
break; /* un goto qui fait sa chochote */

qui tirent sur:
return retour;

par rapport à 36:

return qqchose;

bien alignés dans le switch.

--
Pierre Maurette




Avatar
Albert

Pierre Maurette wrote:



Bonjour,

Albert wrote:

Bonjour a tous,



Bonjour,

Mon probleme est dans le titre.
J'ai un switch case et a l'interieur est il "permis" de sortir
d'un
case par un return ( le switch case est bien sur dans une fonction)
A la compile ( gcc (GCC) 3.2.2 20030222 (Red Hat Linux 3.2.2-5))
je n'ai aucun message d'avertissement. Mais je voudrais etre sur que
c'est correcte. Rien vu a ce sujet.



Oui oui c'est correct. Ceci dit, si il n'y a pas masse de code dans la
fonction après le bloc switch, ce n'est pas très joli.
Voir §6.8.6.4 de la norme (ou d'un brouillon) C99.


<§6.8.6.4.2>
Semantics
2 A return statement terminates execution of the current function and
returns control to its caller. A function may have any number of return
statements.
</§6.8.6.4.2>

A moins d'avoir une raison particulière pour un seul return par
fonction (par exemple des outils de vérification ou de débogage que je
ne connais pas), et dans le cas classique d'un fonction réduite à
d'éventuels inits suivis d'un vaste switch, ça me semble la meilleure
solution même sur le plan du style.



Pour ce cas précis d'inits suivies d'un vaste switch et de petites
fonctions, peut-être, mais en général je ne suis pas d'accord. Il
suffit d'une allocation faite quelquepart, puis 500 lignes plus bas un
switch avec un return dans lequel on a oublié de désallouer ce qui
l'était avant de partir, et c'est la fête des fuites mémoires si la
fonction est appelée souvent.
Sur le plan du style, je trouve moche d'avoir 36 points de retour, et
je pense qu'un return dans un case peut faire cogiter le programmeur un
petit bout de temps si la fonction englobante est volumineuse.


Nous voilà partis dans l'interminable ;-)
Le contre-exemple de l'exemple, les trucs immondes où on alloue
n'importe où et où tout à coup on est devenu nullissime. Puis viendront
les machines improbables, les exemples vécus, les fusées qui tombent, et
j'en passe.
Je me positionne dans le cas où les multiples return s'imposent
logiquement bien entendu, et je considère que le programmeur est capable
de structurer son code, y compris au niveau du style. Bien entendu, si
un seul case n'aboutit pas à return, c'est différent. Dans ces
conditions, je vois mal la supériorité de 36:

retour = qqchose;
break; /* un goto qui fait sa chochote */

qui tirent sur:
return retour;

par rapport à 36:

return qqchose;

bien alignés dans le switch.

Merci a vous tous de vos reponses super rapides.

d'autre part j'ai beau chercher ( ou je m'y prends mal ) j'aimerais
trouver de la doc ( en francais si possible ) sur la norme C99 afin
d'etre un peu plus d'actualite :-)
Bonne journee,
gil





Avatar
Targeur fou
Albert wrote:

Pierre Maurette wrote:



Bonjour,

Albert wrote:

Bonjour a tous,



Bonjour,

Mon probleme est dans le titre.
J'ai un switch case et a l'interieur est il "permis" de sortir
d'un
case par un return ( le switch case est bien sur dans une fonction)
A la compile ( gcc (GCC) 3.2.2 20030222 (Red Hat Linux 3.2.2-5))
je n'ai aucun message d'avertissement. Mais je voudrais etre sur que
c'est correcte. Rien vu a ce sujet.



Oui oui c'est correct. Ceci dit, si il n'y a pas masse de code dans la
fonction après le bloc switch, ce n'est pas très joli.
Voir §6.8.6.4 de la norme (ou d'un brouillon) C99.


<§6.8.6.4.2>
Semantics
2 A return statement terminates execution of the current function and
returns control to its caller. A function may have any number of retu rn
statements.
</§6.8.6.4.2>

A moins d'avoir une raison particulière pour un seul return par
fonction (par exemple des outils de vérification ou de débogage q ue je
ne connais pas), et dans le cas classique d'un fonction réduite à
d'éventuels inits suivis d'un vaste switch, ça me semble la meill eure
solution même sur le plan du style.



Pour ce cas précis d'inits suivies d'un vaste switch et de petites
fonctions, peut-être, mais en général je ne suis pas d'accord. Il
suffit d'une allocation faite quelquepart, puis 500 lignes plus bas un
switch avec un return dans lequel on a oublié de désallouer ce qui
l'était avant de partir, et c'est la fête des fuites mémoires si la
fonction est appelée souvent.
Sur le plan du style, je trouve moche d'avoir 36 points de retour, et
je pense qu'un return dans un case peut faire cogiter le programmeur un
petit bout de temps si la fonction englobante est volumineuse.


Nous voilà partis dans l'interminable ;-)
Le contre-exemple de l'exemple, les trucs immondes où on alloue
n'importe où et où tout à coup on est devenu nullissime. Puis vie ndront
les machines improbables, les exemples vécus, les fusées qui tomben t, et
j'en passe.
Je me positionne dans le cas où les multiples return s'imposent
logiquement bien entendu, et je considère que le programmeur est capa ble
de structurer son code, y compris au niveau du style. Bien entendu, si
un seul case n'aboutit pas à return, c'est différent. Dans ces
conditions, je vois mal la supériorité de 36:

retour = qqchose;
break; /* un goto qui fait sa chochote */

qui tirent sur:
return retour;

par rapport à 36:

return qqchose;

bien alignés dans le switch.

Merci a vous tous de vos reponses super rapides.

d'autre part j'ai beau chercher ( ou je m'y prends mal ) j'aimerais
trouver de la doc ( en francais si possible ) sur la norme C99 afin
d'etre un peu plus d'actualite :-)


C'est ici pour le C, mais en anglais (il s'agit tout de même de normes
internationales, s'adresser à l'AFNOR pour avoir les textes en
français, mais c'est payant) :

http://www.open-std.org/JTC1/SC22/WG14/

Plus précisément, la version de travail qui correspond le mieux au
vrai papier de la norme est la n1124, ici :

http://www.open-std.org/JTC1/SC22/WG14/www/docs/n1124.pdf

A+
Regis






Avatar
Emmanuel Delahaye
Mon probleme est dans le titre.


C'est quoi le titre ?

Si tu as un problème met le dans le corps du message, c'est plus sûr...


<<return dans un switch case>>

J'ai un switch case et a l'interieur est il "permis" de sortir d'un
case par un return ( le switch case est bien sur dans une fonction)
A la compile ( gcc (GCC) 3.2.2 20030222 (Red Hat Linux 3.2.2-5))
je n'ai aucun message d'avertissement. Mais je voudrais etre sur que
c'est correcte. Rien vu a ce sujet.


C'est techniquement faisable. Savoir si c'est de la bonne progammation
ou non est un autre débat.

En tant qu'ardent défenseur des choses simples et de la programmation
structurée, je n'aime pas cette pratique...

--
A+

Emmanuel Delahaye

Avatar
Emmanuel Delahaye
A moins d'avoir une raison particulière pour un seul return par fonction
(par exemple des outils de vérification ou de débogage que je ne connais
pas), et dans le cas classique d'un fonction réduite à d'éventuels inits
suivis d'un vaste switch, ça me semble la meilleure solution même sur le
plan du style.


... ou pour oublier de libérer des ressources...

--
A+

Emmanuel Delahaye

Avatar
Pierre Maurette
A moins d'avoir une raison particulière pour un seul return par fonction
(par exemple des outils de vérification ou de débogage que je ne connais
pas), et dans le cas classique d'un fonction réduite à d'éventuels inits
suivis d'un vaste switch, ça me semble la meilleure solution même sur le
plan du style.


... ou pour oublier de libérer des ressources...
Ce n'est pas sur les pistes noires qu'on se casse le plus du matériel

osseux, ce n'est pas à Waimea ou Pipeline qu'il y a le plus de noyés.
Pourquoi ? Parce que face à l'évidence du danger, le combattant est
prudent.
Donc, en mettant des return absolument n'importe où, aux endroits les
plus improbables, le programmeur d'élite, keskifera ? Il flairera le
danger, supputera le piège, et pensera "Et mes p..... de ressources,
les ai-je bien libérées ?". Dans le baroud, le codeur se sublime.

Donc, vive le return dans les switch quand c'est possible. Sinon, un
petit:
goto finalize;
bien crapuleux ...

--
Pierre Maurette


Avatar
Albert

Mon probleme est dans le titre.



C'est quoi le titre ?

Si tu as un problème met le dans le corps du message, c'est plus sûr...


<<return dans un switch case>>

J'ai un switch case et a l'interieur est il "permis" de sortir
d'un case par un return ( le switch case est bien sur dans une fonction)
A la compile ( gcc (GCC) 3.2.2 20030222 (Red Hat Linux 3.2.2-5))
je n'ai aucun message d'avertissement. Mais je voudrais etre sur que
c'est correcte. Rien vu a ce sujet.



C'est techniquement faisable. Savoir si c'est de la bonne progammation
ou non est un autre débat.

En tant qu'ardent défenseur des choses simples et de la programmation
structurée, je n'aime pas cette pratique...

Bonsoir et merci de votre reponse,

En fait je voulais eviter les if imbriques ou avoir une autre variable
a l'interieur de la fonction ( ce qui faciltait d'un cote mais
alourdissait de l'autre). Mon probleme etait de savoir si le return dans
un switch respectait la norme (vu que je n'ai pas de warning).
C'est une fonction hyper simple de verification des dates entrees pour
le calendrier.
C'est mon premier prg depuis une 15iene d'annees donc soyez indulgents.
Il fonctionne correctement :-)
Bonne soiree
gil


1 2 3 4 5