A quoi correspond le : (seul pas ::)

Résolu
Sim 2005 Messages postés 86 Date d'inscription dimanche 1 mai 2005 Statut Membre Dernière intervention 18 juillet 2009 - 7 juil. 2007 à 21:58
turnerom Messages postés 492 Date d'inscription samedi 10 juillet 2004 Statut Membre Dernière intervention 12 janvier 2012 - 18 juil. 2007 à 14:27
Dans une source j'ai trouvé l'opérateur : . A quoi cela correspond-il (est-ce bien un opérateur).
Voici le lien vers la source : http://www.cppfrance.com/code.aspx?ID=25450
et le morceau de code concerné :
Je ne vois pas comment fonctionne cette zone (surlignée en gras)... Elle ne fait pas non plus parti d'un switch case qui aurait pu justifier l'utilisation du :.

int PrepareDll()
{
  /* du code ...... */
  if(!pStart) goto relDll;
  pStop = (pSTOP) GetProcAddress(hdll, "Stop");
  if(pStop) return 1;
relDll: FreeLibrary(hdll);
delDll:
  DeleteFile(szdll);
  return 0;
}

18 réponses

Sim 2005 Messages postés 86 Date d'inscription dimanche 1 mai 2005 Statut Membre Dernière intervention 18 juillet 2009
7 juil. 2007 à 22:11
A ben si finalement ils y sont mais plus haut.... J'avais pas vu.
3
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
7 juil. 2007 à 22:03
J'ai jamais utilisé ca en C/C++, mais c'est surement un label. Cad un point d'arrivé pour un "goto", une fonction qui n'a plus de raison d'etre utilisé sauf pour faire du code illisible.

goto va_ici;
...
va_ici :
0
Sim 2005 Messages postés 86 Date d'inscription dimanche 1 mai 2005 Statut Membre Dernière intervention 18 juillet 2009
7 juil. 2007 à 22:10
Je pense mais étant donné que je n'ai vu aucun goto ça m'a paru bizarre. J'ai uniquement vu ça dans les sources de BruNews.
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
7 juil. 2007 à 22:20
Mon but ici n'est pas de démarrer un autre débat sur les goto.

"une fonction qui n'a plus de raison d'etre..."
Est encore utilisé pour les sorties de boucles. Exemple:
while(1) {
    while(1) {
       ...
       if(x) goto fin_boucle;
    }
    ...
}
fin_boucle:

".. utilisé sauf pour faire du code illisible"
Dans certain cas, l'utilisation des goto peut générer un code beaucoup plus lisible qu'un enchainement de 10 if par exemple.
if(x) {
    ...
    if(y) {
        ...
       if(z) {
          ...
          if(x1) {
             ... // <- Ça commence à faire beaucoup de tab ici
          }
       }
    }
}
        

C++ (@++)<!--
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
7 juil. 2007 à 22:48
Un enchainement de 10 if ne doit pas arriver. Dans quelle sorte de programme une telle structure apparait ? J'ai jamais vu un truc pareil.

Pour l'imbrication des boucles, je suis d'accord ca "peut" servir. Mais devoir sortir de deux boucles en meme temps en les court circuitant, j'ai jamais eu besoin et pourtant j'en suis pas a ma première ligne de code. Le seul cas que j'imagine, c'est dans le cas des manipulations de tableau de tableaux mais dans ce cas, c'est pas un goto, mais un return qu'on trouvera plutot.

Enfin bref, le jour ou j'aurais besoin d'un goto, je viendrais poster ici :)
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
7 juil. 2007 à 23:01
Gaffe qu'il y en a un dans l'implem de qsort() (1er qui me vient à l'esprit).

ciao...
BruNews, MVP VC++
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
7 juil. 2007 à 23:10
Les 10 if, c'était pour ce faire une idée :). Reste quand même que 3 ou 4 if ensemble, ça commence à faire beaucoup en terme d'espace (les tab), de caractère (le accolades par ex) etc.

Pour ce qui est de court-circuiter une double boucles, je n'arrive pas à trouver d'exemple réel mais je peux t'affirmer que j'ai déjà eu à en coder.

Voici un autre exemple d'utilisation de goto:
http://www.codyx.org/snippet_exclure-caracteres-chaine_376.aspx#1287

S'il y a un moyen de faire équivalent sans goto et sans code ASM supplémentaire, ben... je ne le connais pas :)

C++ (@++)<!--
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
7 juil. 2007 à 23:16
Oups, mauvais lien:
http://www.codyx.org/snippet_exclure-caracteres-chaine_376.aspx#1211

En passent, si quelqu'un peut faire un équivalent sans goto, je serais curieux de voir ce que ça donne.

C++ (@++)<!--
0
acx01b Messages postés 280 Date d'inscription dimanche 7 septembre 2003 Statut Membre Dernière intervention 8 juillet 2014 6
7 juil. 2007 à 23:32
salut

celle ci me parait effectivement aussi bien sans goto
et c'est dûr à dire mais j'ai pas l'impression qu'elle soit moins performante ?

void  virer (char *string, const char *tokens) {
  char *s = string;
  char *c = tokens;
  while (*s) {
     if (!*c) {
        *string++ = *s++;
        c = tokens;
     }
     else if (*c == *s)  {
        s++;
        c = tokens;
     }
     else c++;
  }
  *string = 0;
}
0
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
7 juil. 2007 à 23:36
Salut,

label:

if(condition) goto label;
c'est clairement un do while.
Parfait
exemple du goto qui sert a rien et qui rend le code moche et illisible.
Le C propose plusieurs types de boucles, pourquoi s'en priver ?

Le must c'est quand meme de voir ca dans les codes snippets...
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
7 juil. 2007 à 23:58
acx01b >> Aucune idée. Génère un listing pour voir le code ASM

aardman >> Comment coderais tu le snippet que j'ai donné en exemple sans le goto ?

C++ (@++)<!--
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
8 juil. 2007 à 00:12
Laisse, je peux y répondre moi-même:

char *exclchrs1 (char *string, char *e)
{
    char *c, *p;
 
    if(!string || !e || !*e) return 0; // <- À retirer dans un code sûr
 
    c = string;
 
    while(*c) {
        p = e;
        do
            if(*p == *c) {
                c++;
                p = e;
            }
        while(*++p);
 
        *string++ = *c++;
    }
 
    return string; // Retour sur 0 de fin de chaîne
}

C++ (@++)<!--
0
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
8 juil. 2007 à 00:20
Salut,

y'a 5000 facons de coder un truc comme ca, mais pour une fonction
basique de ce style, y'a juste besoin de boucles, pas besoin de goto.
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
8 juil. 2007 à 00:47
Ça y est. Même si j'avais dis que je ne voulais pas démarrer un combat sur les goto, je l'ai tout de même enclenché :)

J'ai écrit trop vite. Cette fonction est invalide car elle lit en dehors de la chaine. Celle-ci devrait être correcte:

char *exclchrs (char *string, char *e)
{
    char *c, *p;
 
    if(!string || !*string || !e || !*e) return 0; // <- À retirer dans un code sûr
 
    c = string;
 
    while(1) {
        p = e;
        do
            if(*p == *c) {
                c++;
                p = e;
            }
        while(*++p);

        *string = *c;

        if(*c) {
            string++;
            c++;
        }
        else break;
    }
    return string; // Retour sur 0 de fin de chaîne
}

Cependant, cette fonction continue inutilement de tester les caractères excluent sur le 0 de fin de chaine de string. On peut corriger ce problème en ajoutant un && *c au while(*++p) mais on se trouve à effectuer un double test à ce niveau donc... De plus, on doit ajouter un test (pour les codes non sûr) de plus pour savoir si string n'est pas vide.
Finalement, je sais pas pour toi, mais moi je trouve ça plus "illisible" qu'avec un simple goto

" y'a 5000 facons de coder un truc comme ca"
C'est vrai mais le problème c'est de trouver la meilleur et la meilleur nécessite peut-être un goto.

C++ (@++)<!--
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
8 juil. 2007 à 00:51
mais non puisque c'est tabou....
Il est bien évident que ce qui était en 4 lignes "illisibles" avec 'goto' sera tellement plus clair en 20 sans.

ciao...
BruNews, MVP VC++
0
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
8 juil. 2007 à 01:54
Salut,

BruNews> Tabou, tout de suite les grands mots...

J'ai pas dit que j'etais archicontre les goto, mais juste que je
comprend pas vraiment l'interet de mettre un goto la ou une boucle
'normale' suffit.
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
8 juil. 2007 à 02:24
C'est sûr mais pour l'instant, personne ne m'a encore montré que mon code pouvait être codé sans goto avec la même "lisibilité" et sans code ASM supplémentaire.

BruNews >> S'il y a un moyen de recoder mon code sans goto, tu pourrais sans doute être capable de le faire non ?

C++ (@++)<!--
0
turnerom Messages postés 492 Date d'inscription samedi 10 juillet 2004 Statut Membre Dernière intervention 12 janvier 2012 1
18 juil. 2007 à 14:27
char *exclchrs (char *string, char *e)
{
    char *c, *p;

    if (!string || !e || !*e)
        return 0; // <- À retirer dans un code sûr

    c = string;
    p = e;
    while (*c)
    {
        if (*p == *c){++c; continue;}
        if (!*++p)
        {
          *string++ = *c++;
          p = e;
        }
    }

    *string = 0;

    return string; // Retour sur 0 de fin de chaîne
}

<hr size="2" width="100%" />TuRn3r
0
Rejoignez-nous