A quoi correspond le : (seul pas ::)

[Résolu]
Signaler
Messages postés
86
Date d'inscription
dimanche 1 mai 2005
Statut
Membre
Dernière intervention
18 juillet 2009
-
Messages postés
492
Date d'inscription
samedi 10 juillet 2004
Statut
Membre
Dernière intervention
12 janvier 2012
-
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

Messages postés
86
Date d'inscription
dimanche 1 mai 2005
Statut
Membre
Dernière intervention
18 juillet 2009

A ben si finalement ils y sont mais plus haut.... J'avais pas vu.
Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Statut
Membre
Dernière intervention
28 juillet 2008
5
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 :
Messages postés
86
Date d'inscription
dimanche 1 mai 2005
Statut
Membre
Dernière intervention
18 juillet 2009

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.
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
15
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++ (@++)<!--
Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Statut
Membre
Dernière intervention
28 juillet 2008
5
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 :)
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
29
Gaffe qu'il y en a un dans l'implem de qsort() (1er qui me vient à l'esprit).

ciao...
BruNews, MVP VC++
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
15
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++ (@++)<!--
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
15
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++ (@++)<!--
Messages postés
280
Date d'inscription
dimanche 7 septembre 2003
Statut
Membre
Dernière intervention
8 juillet 2014
5
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;
}
Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
3
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...
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
15
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++ (@++)<!--
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
15
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++ (@++)<!--
Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
3
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.
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
15
Ç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++ (@++)<!--
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
29
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++
Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
3
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.
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
15
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++ (@++)<!--
Messages postés
492
Date d'inscription
samedi 10 juillet 2004
Statut
Membre
Dernière intervention
12 janvier 2012
1
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