IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Que pensez vous du goto [Débat]


Sujet :

C

  1. #141
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 629
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 629
    Points : 30 692
    Points
    30 692
    Par défaut
    Citation Envoyé par nemo69500
    ca me fais rire quand les gens dise "j'utilise pas de goto" parce que ces meme personne viennent utiliser des case avec les switch , des default ... et tous ceci sont des goto , enfin bon , le goto fais partis du c , il se compile avec gcc donc moi perso , si il est pas utiliser n importe comment je trouce ca correct
    Attention, on est bien tous conscients du fait qu'un switch ... case ou autre boucles -en ce y compris tous les langages de troisième génération et toute structure "décisionnelle"- n'est en définitive qu'un goto plus ou moins déguisé...

    Et l'on est tous aussi daccord pour dire que goto est sans doute l'instruction qui se retrouve dans le plus de langages différents.

    Ce que l'on reproche principalement au goto, c'est d'être une instruction par trop générique, et qui souffre donc d'inconvéniants qui font qu'il est très lagrement préférable de s'en passer, dans la très grosse majorité des cas...

    Meme s'il sera toujours possible de trouver un cas particulier dans lequel l'utilisation du goto peut etre pleinement justifié et, meme, présenter en tout état de cause la moins mauvaise des solutions...

    Mais ca, c'est pour la simple et bonne raison que le dicton "il y a toujours une exception qui confirme la regle" s'arrangera toujours pour etre vérifié

    Les trois reproches principaux que l'on fasse au goto, et qui suffisent à eux seuls à motiver le fait qu'il faille éviter d'y avoir recours, c'est:
    • du fait de sa "généricité", il autorise tout et n'importe quoi, y compris des comportements suicidaires du genre de passer directement, et sans s'en appercevoir, dans une fonction différente
    • qu'il rend la relecture du code bien plus difficile que les autres structures décisionnelles clairement structurée (AKA: ou chaque bloc d'instructions est clairement défini et présente une indentation correcte)
    • il n'apporte aucun avantage en terme de temps d'exécution par rapport aux structures existantes pour le remplacer... Pire que ca: je ne suis pas sur du tout que le compilateur n'aura pas plus de mal à optimiser le résultat, simplement parce qu'il aura plus de mal à retrouver les blocs logiques...(j'attire l'attention de tous sur le fait que je n'ai jamais effectué de mesures précises sur la dernière partie de cet argument, qui n'engage donc que moi )

    Finalement, rien ne t'empeche non plus de décider de rouler à deux fois la vitesse maximale autorisée et/ou à contre-sens sur l'autoroute... tu trouveras tout seul quantité de bonnes raisons -allant du fait que tu n'est pas *tout à fait* suicidaire à la salutaire peur du gendarme - pour ne pas le faire

    De la meme manière, goto existe et tu peux donc décider de l'utiliser... mais tu trouveras une quantité de raisons qui t'inciteront à ne pas le faire, par simple bon sens...

  2. #142
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Hey bro', ya sh'd try the Duff's Device...
    ???

  3. #143
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par koala01
    du fait de sa "généricité", il autorise tout et n'importe quoi, y compris des comportements suicidaires du genre de passer directement, et sans s'en appercevoir, dans une fonction différente
    Pas en C heureusement (ou alors, il faut passer par setjmp()/longjmp(), mais c'est autre chose).
    De la meme manière, goto existe et tu peux donc décider de l'utiliser... mais tu trouveras une quantité de raisons qui t'inciteront à ne pas le faire, par simple bon sens...
    Le bon sens, que j'apprécie et que je revendique, est malheureusement connoté 'réactionnaire' dans notre société bien pensante. Il n'est donc pas aisé d'en parler... Mais ça ne m'empêche pas d'y référer. Bienvenu au club !

  4. #144
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985

  5. #145
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    Par défaut
    Oui, mais ça, c'est un détournement du switch-case : On ne peut pas appeler ça une utilisation "régulière" ni structurée...

    En effet, le switch-case permet de faire un truc aussi horrible. Mais d'un autre coté, les goto aussi...
    Le switch-case tient un minimum le goto en laisse par le fait qu'il n'y ait (tant qu'on n'y mèle pas un goto) qu'un seul point d'origine pour chaque label et que le saut ne sorte pas du switch...

  6. #146
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Ok, je vois! C'est pas très beau...

    Thierry

  7. #147
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 923
    Points
    17 923
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Le bon sens, que j'apprécie et que je revendique, est malheureusement connoté 'réactionnaire' dans notre société bien pensante. Il n'est donc pas aisé d'en parler... Mais ça ne m'empêche pas d'y référer. Bienvenu au club !
    Humour :

    Je viens de recevoir cet avis de décès ( Ci-après ). Sûrement t'étais tu déjà aperçu de son absence. Je souhaite qu'il se réincarne bientôt. Je vais faire tout ce qui est en mon possible pour lui préparer une place.
    En attendant, je te présente mes plus sincères condoléances.

    En toutes âme...mitiés,
    Marcel

    Voici l'avis de décès:

    Aujourd'hui nous déplorons le décès d' un ami très cher qui se nommait "Bon Sens" et qui a vécu parmi nous depuis de longues années.

    Personne ne connaît exactement son âge, car les registres de naissances ont été perdus il y a bien longtemps dans les méandres de la bureaucratie.

    On se souvient de lui pour des leçons de vie, comme "La journée
    Appartient à celui qui se lève tôt ", "Il ne faut pas tout attendre des autres" et "Ce qui arrive est peut-être de MA faute".

    " Bon Sens " vivait avec des règles simples et pratiques, comme "Ne pas dépenser plus que ce que l'on a", et des principes éducatifs clairs, comme "Ce sont les parents, et non les enfants, qui décident ".

    " Bon Sens " a perdu pied quand des parents ont attaqué des professeurs pour avoir fait leur travail en voulant apprendre aux enfants les bonnes manières et le respect. Un enseignant renvoyé, pour avoir réprimandé un élève trop excité, a encore aggravé l'état de santé de " Bon Sens ".

    Il s' est encore plus détérioré quand les écoles ont dû demander et obtenir une autorisation parentale pour mettre un pansement sur le petit bobo d' un élève, sans pouvoir informer les parents de dangers bien plus graves encourus par l'enfant.

    " Bon Sens " a perdu la volonté de survivre quand des criminels
    Recevaient un meilleur traitement que leurs victimes. Il a encore pris des coups quand cela devint répréhensible de se défendre contre un voleur dans sa propre maison et que le voleur pouvait porter plainte pour agression.

    " Bon Sens " a définitivement perdu sa foi quand une femme qui n' avait pas réalisé qu' une tasse de café bouillante était chaude, en a renversé une petite goutte sur sa jambe, et pour cela a perçu une indemnisation colossale.

    La mort de " Bon Sens " a été précédée par celle de ses parents : Vérité et Confiance, de celle de sa femme Discrétion, de celle de sa fille Responsabilité ainsi que de celle de son fils Raison.

    Il laisse toute la place à ses trois faux-frères: "Je connais mes droits", "C'est la faute de l'Autre" et "Je suis une victime".

    Il n' y avait pas foule à son enterrement car il n' y a plus beaucoup de personnes pour se rendre compte qu' il est parti. Si vous vous souvenez de lui, faites circuler cette lettre, sinon ne faites rien!

    Auteur inconnu

  8. #148
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    572
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Février 2007
    Messages : 572
    Points : 675
    Points
    675
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Super compact et tout. Très C-geek.

    Bug ! Si le 2ème fichier échoue à l'ouverture : le premier n'est pas fermé.

    Ici, c'est sans conséquences, mais dans un serveur, ou autre 24/7, ca peut tuer assez rapidement...
    C'est pas tres fairplay . Il faudrait pour comparer deux codes sans bug ...

    Je ne cherche pas forcement a faire du code de geek, mais plutot le code le plus lisible et le plus maintenable.

    Le mieux, c'est peut être d'expliquer les trois types de traitement d'erreurs que je connais.

    Je commence par le classique (en reprenant l'exemple)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
     
    int main (void)
    {
       FILE *fp_in = fopen (f_src, "r");
       if (fp_in != NULL)
       {
          FILE *fp_out = fopen (f_des, "w");
          if (fp_out != NULL)
          {
             char* buf;
             buf = malloc(sizeof(char)*64);
             if (buf!=NULL)
             {
                 ...      
                 free(buf);
             }  
             else
             {
                 perror(buf);
             }
             fclose (fp_out), fp_out = NULL;
          }
          else
          {
             perror (f_des);
          } 
          fclose (fp_in), fp_in = NULL;
       }
       else
       {
          perror (f_src);
       }
       return 0;
    }
    Le probleme, c'est que plus il y a d'erreurs à traiter, plus le nombre de if imbriqués augmentent. Assez rapidement, le code ne devient plus tres lisible. En fait, le code nominal (celui qui est executé dans 90% des cas, les ... dans l'exemple) se retrouve completement décalé à droite (en tout cas difficile de respecter 80 colonnes dans ces conditions), et les correspondances des else avec les if ne sont plus tres evidentes.

    le deuxieme approche, c'est d'ecrire quelque chose du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
     
    int main (void)
    {
       FILE *fp_in = NULL;
       FILE *fp_out = NULL;
       char* buf = NULL;
     
       fp_in = fopen (f_src, "r");
       if (fp_in == NULL) {
           perror(fp_in);
           return 0;
       }
     
       fp_out = fopen (f_des, "w") 
       if (fp_out == NULL) {
           perror(fp_out);
           fclose (fp_in), fp_in=NULL;
           return 0;
       }
     
       buf = malloc(sizeof(char)*64);
       if (buf==NULL) {
           perror(buf);
           fclose (fp_in), fp_in=NULL;
           fclose (fp_out), fp_out=NULL;
           return 0;
       }
     
        ...
     
        fclose (fp_out), fp_out = NULL;      
        fclose (fp_in), fp_in = NULL;
        free(buf);
     
       return 0;
    }
    Pas terrible pour la maintenance a vrai dire, il y a de forte chance d'oublier de liberer une ressource, notamment lorsqu'on modifie la fonction apres coup.

    Et voila la version avec les goto
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
       FILE *fp_in = NULL;
       FILE *fp_out = NULL;
       char* buf = NULL;
     
       fp_in = fopen (f_src, "r");
       if (fp_in == NULL) 
           goto fp_in_error;
     
       fp_out = fopen (f_des, "w") 
       if (fp_out == NULL) 
           goto fp_out_error;
     
       buf = malloc(sizeof(char)*64);
       if (buf==NULL) 
           goto buf_error;
     
        ...
     
        fclose (fp_out), fp_out = NULL;      
        fclose (fp_in), fp_in = NULL;
        free(buf);
        return 0;
     
    fp_in_error:
        perror(fp_in);
        goto error;
    fp_out_error:
        perror(fp_out);
        goto error;
    buf_error:
        perror(buf);
        goto error;
    error:
        if (fp_out!=NULL)
           fclose (fp_out);      
        if (fp_in!=NULL) 
           fclose (fp_in);
        if (buf!=NULL)
           free(buf);
        return 0;
    C'est pas vraiment plus compact, l'interet, c'est surtout de séparer le code nominal de la gestion des erreurs, et de bien traiter la liberation des ressources.

    J'ai vu ces trois types de traitement d'erreurs dans des projets de tailles identiques.

    Si quelqu'un connait une autre méthode, je suis tout ouï.

  9. #149
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Merci Sanguko pour cette comparaison très intéressante. Je pense que si on arrive à imposer une limite quand à la taille des fonctions et qu'on parvient à maintenir ces dernières assez compactes, le premier exemple proposé est supérieur du point de vue de la lisibilité et de la facilité de maintenance, du moment que le nombre de if ... else... imbriqués reste raisonable.

    Thierry

  10. #150
    Inactif  

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    534
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 534
    Points : 403
    Points
    403
    Par défaut
    Bonjour,

    Le goto est à éviter. Seulement dans certains cas on le trouve pratique.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
     
     
    //#include <stdlib.h>
    #include <stdio.h>
     
    int Array[] = { 100, -4, 11 ,99,-9,5,78,90,37,71,1,54,31,-2, -1 ,123,-9,7,36,198,11,98,67,38,12,7,23,78,89,32,2 };
    unsigned  max = sizeof( Array ) / sizeof( Array[0] ) ;
     
     int intcomp( int *c1, int *c2 )
        { return( *c1 - *c2 ) ; }
     
    typedef int comparF (const void *, const void *);
     
    static  comparF    *Fcmp;
    static  unsigned    qWidth;
    #define _LT_(x,y)       (x < y)
     
    /*-----------------------------------------------------------------------*
    Name            Exchange - exchanges two objects
    Usage           static  void  Exchange (void  *leftP, void *rightP);
    Description     exchanges the qWidth byte wide objects pointed to
    		by leftP and rightP.
    Return value    Nothing
    *------------------------------------------------------------------------*/
     
     void  Exchange (void  *leftP, void *rightP)
      { unsigned  i;
        char  c;
        char *lp = (char *)leftP;
        char *rp = (char *)rightP;
     
        for (i = 0; i < qWidth; i++ )
         { c = *rp;
           *rp++ = *lp;
           *lp++ = c;
         }
      }
     
    /*-----------------------------------------------------------------------*
    Background
     
    The Quicker Sort algorithm was first described by C.A.R.Hoare in the
    Computer Journal, No. 5 (1962), pp.10..15, and in addition is frequently
    described in computing literature, notably in D. Knuth's Sorting and
    Searching.  The method used here includes a number of refinements:
     
    - The median-of-three technique described by Singleton (Communications
      of the A.C.M., No 12 (1969) pp 185..187) is used, where the median
      operation is also the special case sort for 3 elements.  This slightly
      improves the average speed, especially when comparisons are slower
      than exchanges, but more importantly it prevents worst-case behavior
      on partly sorted files.  If a simplistic quicker-sort is run on a file
      which is only slightly disordered (a common need in some applications)
      then it is as slow as a bubble-sort.  The median technique prevents
      this.
     
      Another serious problem with the plain algorithm is that worst-case
      behavior causes very deep recursion (almost one level per table
      element !), so again it is best to use the median technique.
     
    - The values of width and compar are copied to static storage and a help
      function with a minimum of parameters is used to reduce the recursion
      overheads.  Recursion is used both for simplicity and because there
      is no practical gain from conversion to loops: the extra housekeeping
      needed for loops needs registers for speed, but the 8086 family has not
      enough registers.  Juggling registers takes just as much time as calling
      subroutines.
     
    /************************************************************************/
    Name            qSortHelp - performs the quicker sort
    Usage           static void  near pascal  qSortHelp (char *pivotP,
    						     size_t nElem);
    Description     performs the quicker sort on the nElem element array
    		pointed to by pivotP.
    Return value    Nothing
    *------------------------------------------------------------------------*/
     
    void  qSortHelp (char *pivotP, size_t nElem)
    {   char     *leftP, *rightP, *pivotEnd, *pivotTemp, *leftTemp;
        unsigned  lNum;
        int       retval;
     
    tailRecursion:
        if (nElem <= 2)
         { if (nElem == 2)
    	{ if (Fcmp (pivotP, rightP = qWidth + pivotP) > 0)
    	  Exchange (pivotP, rightP);
    	}
          return;
         }
     
        rightP = (nElem - 1) * qWidth + pivotP;
        leftP  = (nElem >> 1) * qWidth + pivotP;
        //leftP  = (nElem / 2 ) * qWidth + pivotP;
     
    /*  sort the pivot, left, and right elements for "median of 3" */
     
        if (Fcmp (leftP, rightP) > 0)
    	Exchange (leftP, rightP);
        if (Fcmp (leftP, pivotP) > 0)
    	Exchange (leftP, pivotP);
        else if (Fcmp (pivotP, rightP) > 0)
    	Exchange (pivotP, rightP);
     
        if (nElem == 3)
           { Exchange (pivotP, leftP);
    	 return;
           }
     
    /*  now for the classic Hoare algorithm */
     
        leftP = pivotEnd = pivotP + qWidth;
     
        do {
    	while( (retval = Fcmp(leftP, pivotP)) <= 0)
    	 { if (retval == 0)
    	   { Exchange(leftP, pivotEnd);
    	     pivotEnd += qWidth;
    	   }
    	   if (_LT_ (leftP, rightP)) leftP += qWidth;
    	   else goto qBreak;
    	 }
    	while (_LT_(leftP, rightP))
    	 {  if ((retval = Fcmp(pivotP, rightP)) < 0)
    	    rightP -= qWidth;
    	    else
    	    { Exchange (leftP, rightP);
    	      if (retval != 0)
    	       { leftP += qWidth;
    		 rightP -= qWidth;
    	       }
    	     break;
    	    }
    	 }
           } while (_LT_(leftP, rightP));
     
     qBreak:
     
        if (Fcmp(leftP, pivotP) <= 0)
    	leftP = leftP + qWidth;
     
        leftTemp = leftP - qWidth;
        pivotTemp = pivotP;
        while ((pivotTemp < pivotEnd) && (leftTemp >= pivotEnd))
         { Exchange(pivotTemp, leftTemp);
           pivotTemp += qWidth;
           leftTemp -= qWidth;
         }
     
        lNum = (leftP - pivotEnd) / qWidth;
        nElem = ((nElem * qWidth + pivotP) - leftP)/qWidth;
     
        /* Sort smaller partition first to reduce stack usage */
        if (nElem < lNum)
    	{ qSortHelp (leftP, nElem);
    	  nElem = lNum;
    	}
        else
    	{ qSortHelp (pivotP, lNum);
    	  pivotP = leftP;
    	}
        goto tailRecursion;
    }
     
    /*-----------------------------------------------------------------------*
    Name            qsort - sorts using the quick sort routine
    Usage           void qsort(void *base, int nelem, int width, int (*fcmp)());
    Prototype in    stdlib.h
    Description     qsort is an implementation of the "median of three"
    		variant of the quicksort algorithm. qsort sorts the entries
    		in a table into order by repeatedly calling the user-defined
    		comparison function pointed to by fcmp.
     
    		base points to the base (0th element) of the table to be sorted.
     
    		nelem is the number of entries in the table.
     
    		width is the size of each entry in the table, in bytes.
     
    		*fcmp, the comparison function, accepts two arguments, elem1
    		and elem2, each a pointer to an entry in the table. The
    		comparison function compares each of the pointed-to items
    		(*elem1 and *elem2), and returns an integer based on the result
    		of the comparison.
     
    			If the items            fcmp returns
     
    			*elem1 <  *elem2         an integer < 0
    			*elem1 == *elem2         0
    			*elem1 >  *elem2         an integer > 0
     
    		In the comparison, the less than symbol (<) means that the left
    		element should appear before the right element in the final,
    		sorted sequence. Similarly, the greater than (>) symbol
    		means that the left element should appear after the right
    		element in the final, sorted sequence.
     
    Return value    qsort does not return a value.
     
    *------------------------------------------------------------------------*/
     
    void  Qsort(void *baseP, size_t nElem, size_t width, comparF *compar)
    /*
      The table *baseP containing a count of nElem records each of fixed width
      is to be converted from unknown order into ascending order, using the
      ordering provided by the comparison function compar.
     
      The comparison function compar (leftP, rightP) must return less than, equal,
      or greater than zero, according to whether it decides that (record) *leftP
      is less than, equal, or greater than (record) *rightP.
     
      The internal contents of the records are never inspected by qsort.  It
      depends entirely upon compar to decide the format and value of the records.
      This allows the content of the records to be of any fixed length type -
      formatted text, floating point, pointer to variable length record, etc. -
      so long as each record is understood by compar.
     
      The quicker sort algorithm will in general change the relative ordering
      of records which may compare as equal.  For example, if it is attempted
      to use two passes of quick sort on a order file, first by date and then
      by customer name, the result will be that the second sort pass randomly
      jumbles the dates.  It is necessary to design the compar() function to
      consider all the keys and sort in one pass.
    */
     
     {
        if ((qWidth = width) == 0)	return;
        Fcmp = compar;
        qSortHelp (baseP, nElem);
     }
     
      void say( int * A , size_t nb )
       { size_t i ;
         for( i = 0 ; i < nb; i++ )
         printf("%d ", A[i] ) ;
         printf("\n");
       }
     
      void main()
       { puts("Begin");
         say( Array, max ) ;
         Qsort( Array, max, sizeof(int), (comparF*) intcomp ) ;
         say( Array, max ) ;
         puts("End");
         getchar();
       }
    Si vous avez le temps proposez un autre algo sans le goto. Le quicksort n' est performant que sur des données non contigues. Pour la médiane de trois qui corrige ce défaut, on a restitué le goto à des fins opérationnelles.

    Je vous ai fait un simple copier coller.

    Salut.

  11. #151
    Membre éclairé Avatar de AuraHxC
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2006
    Messages : 652
    Points : 662
    Points
    662
    Par défaut
    J'utilise pas goto parce que j'en ai jamais vu l'utilité, après si on me prouve qu'il est utile et obligatoire dans un cas pourquoi mais pour l'instant j'ai jamais eu de cas ou je devais utiliser un goto.

  12. #152
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par dj.motte
    Ca commence mal.

  13. #153
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Citation Envoyé par dj.motte
    Bonjour,

    Le goto est à éviter. Seulement dans certains cas on le trouve pratique.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
     
     
    //#include <stdlib.h>
    #include <stdio.h>
     
    int Array[] = { 100, -4, 11 ,99,-9,5,78,90,37,71,1,54,31,-2, -1 ,123,-9,7,36,198,11,98,67,38,12,7,23,78,89,32,2 };
    unsigned  max = sizeof( Array ) / sizeof( Array[0] ) ;
     
     int intcomp( int *c1, int *c2 )
        { return( *c1 - *c2 ) ; }
     
    typedef int comparF (const void *, const void *);
     
    static  comparF    *Fcmp;
    static  unsigned    qWidth;
    #define _LT_(x,y)       (x < y)
     
    /*-----------------------------------------------------------------------*
    Name            Exchange - exchanges two objects
    Usage           static  void  Exchange (void  *leftP, void *rightP);
    Description     exchanges the qWidth byte wide objects pointed to
    		by leftP and rightP.
    Return value    Nothing
    *------------------------------------------------------------------------*/
     
     void  Exchange (void  *leftP, void *rightP)
      { unsigned  i;
        char  c;
        char *lp = (char *)leftP;
        char *rp = (char *)rightP;
     
        for (i = 0; i < qWidth; i++ )
         { c = *rp;
           *rp++ = *lp;
           *lp++ = c;
         }
      }
     
    /*-----------------------------------------------------------------------*
    Background
     
    The Quicker Sort algorithm was first described by C.A.R.Hoare in the
    Computer Journal, No. 5 (1962), pp.10..15, and in addition is frequently
    described in computing literature, notably in D. Knuth's Sorting and
    Searching.  The method used here includes a number of refinements:
     
    - The median-of-three technique described by Singleton (Communications
      of the A.C.M., No 12 (1969) pp 185..187) is used, where the median
      operation is also the special case sort for 3 elements.  This slightly
      improves the average speed, especially when comparisons are slower
      than exchanges, but more importantly it prevents worst-case behavior
      on partly sorted files.  If a simplistic quicker-sort is run on a file
      which is only slightly disordered (a common need in some applications)
      then it is as slow as a bubble-sort.  The median technique prevents
      this.
     
      Another serious problem with the plain algorithm is that worst-case
      behavior causes very deep recursion (almost one level per table
      element !), so again it is best to use the median technique.
     
    - The values of width and compar are copied to static storage and a help
      function with a minimum of parameters is used to reduce the recursion
      overheads.  Recursion is used both for simplicity and because there
      is no practical gain from conversion to loops: the extra housekeeping
      needed for loops needs registers for speed, but the 8086 family has not
      enough registers.  Juggling registers takes just as much time as calling
      subroutines.
     
    /************************************************************************/
    Name            qSortHelp - performs the quicker sort
    Usage           static void  near pascal  qSortHelp (char *pivotP,
    						     size_t nElem);
    Description     performs the quicker sort on the nElem element array
    		pointed to by pivotP.
    Return value    Nothing
    *------------------------------------------------------------------------*/
     
    void  qSortHelp (char *pivotP, size_t nElem)
    {   char     *leftP, *rightP, *pivotEnd, *pivotTemp, *leftTemp;
        unsigned  lNum;
        int       retval;
     
    tailRecursion:
        if (nElem <= 2)
         { if (nElem == 2)
    	{ if (Fcmp (pivotP, rightP = qWidth + pivotP) > 0)
    	  Exchange (pivotP, rightP);
    	}
          return;
         }
     
        rightP = (nElem - 1) * qWidth + pivotP;
        leftP  = (nElem >> 1) * qWidth + pivotP;
        //leftP  = (nElem / 2 ) * qWidth + pivotP;
     
    /*  sort the pivot, left, and right elements for "median of 3" */
     
        if (Fcmp (leftP, rightP) > 0)
    	Exchange (leftP, rightP);
        if (Fcmp (leftP, pivotP) > 0)
    	Exchange (leftP, pivotP);
        else if (Fcmp (pivotP, rightP) > 0)
    	Exchange (pivotP, rightP);
     
        if (nElem == 3)
           { Exchange (pivotP, leftP);
    	 return;
           }
     
    /*  now for the classic Hoare algorithm */
     
        leftP = pivotEnd = pivotP + qWidth;
     
        do {
    	while( (retval = Fcmp(leftP, pivotP)) <= 0)
    	 { if (retval == 0)
    	   { Exchange(leftP, pivotEnd);
    	     pivotEnd += qWidth;
    	   }
    	   if (_LT_ (leftP, rightP)) leftP += qWidth;
    	   else goto qBreak;
    	 }
    	while (_LT_(leftP, rightP))
    	 {  if ((retval = Fcmp(pivotP, rightP)) < 0)
    	    rightP -= qWidth;
    	    else
    	    { Exchange (leftP, rightP);
    	      if (retval != 0)
    	       { leftP += qWidth;
    		 rightP -= qWidth;
    	       }
    	     break;
    	    }
    	 }
           } while (_LT_(leftP, rightP));
     
     qBreak:
     
        if (Fcmp(leftP, pivotP) <= 0)
    	leftP = leftP + qWidth;
     
        leftTemp = leftP - qWidth;
        pivotTemp = pivotP;
        while ((pivotTemp < pivotEnd) && (leftTemp >= pivotEnd))
         { Exchange(pivotTemp, leftTemp);
           pivotTemp += qWidth;
           leftTemp -= qWidth;
         }
     
        lNum = (leftP - pivotEnd) / qWidth;
        nElem = ((nElem * qWidth + pivotP) - leftP)/qWidth;
     
        /* Sort smaller partition first to reduce stack usage */
        if (nElem < lNum)
    	{ qSortHelp (leftP, nElem);
    	  nElem = lNum;
    	}
        else
    	{ qSortHelp (pivotP, lNum);
    	  pivotP = leftP;
    	}
        goto tailRecursion;
    }
     
    /*-----------------------------------------------------------------------*
    Name            qsort - sorts using the quick sort routine
    Usage           void qsort(void *base, int nelem, int width, int (*fcmp)());
    Prototype in    stdlib.h
    Description     qsort is an implementation of the "median of three"
    		variant of the quicksort algorithm. qsort sorts the entries
    		in a table into order by repeatedly calling the user-defined
    		comparison function pointed to by fcmp.
     
    		base points to the base (0th element) of the table to be sorted.
     
    		nelem is the number of entries in the table.
     
    		width is the size of each entry in the table, in bytes.
     
    		*fcmp, the comparison function, accepts two arguments, elem1
    		and elem2, each a pointer to an entry in the table. The
    		comparison function compares each of the pointed-to items
    		(*elem1 and *elem2), and returns an integer based on the result
    		of the comparison.
     
    			If the items            fcmp returns
     
    			*elem1 <  *elem2         an integer < 0
    			*elem1 == *elem2         0
    			*elem1 >  *elem2         an integer > 0
     
    		In the comparison, the less than symbol (<) means that the left
    		element should appear before the right element in the final,
    		sorted sequence. Similarly, the greater than (>) symbol
    		means that the left element should appear after the right
    		element in the final, sorted sequence.
     
    Return value    qsort does not return a value.
     
    *------------------------------------------------------------------------*/
     
    void  Qsort(void *baseP, size_t nElem, size_t width, comparF *compar)
    /*
      The table *baseP containing a count of nElem records each of fixed width
      is to be converted from unknown order into ascending order, using the
      ordering provided by the comparison function compar.
     
      The comparison function compar (leftP, rightP) must return less than, equal,
      or greater than zero, according to whether it decides that (record) *leftP
      is less than, equal, or greater than (record) *rightP.
     
      The internal contents of the records are never inspected by qsort.  It
      depends entirely upon compar to decide the format and value of the records.
      This allows the content of the records to be of any fixed length type -
      formatted text, floating point, pointer to variable length record, etc. -
      so long as each record is understood by compar.
     
      The quicker sort algorithm will in general change the relative ordering
      of records which may compare as equal.  For example, if it is attempted
      to use two passes of quick sort on a order file, first by date and then
      by customer name, the result will be that the second sort pass randomly
      jumbles the dates.  It is necessary to design the compar() function to
      consider all the keys and sort in one pass.
    */
     
     {
        if ((qWidth = width) == 0)	return;
        Fcmp = compar;
        qSortHelp (baseP, nElem);
     }
     
      void say( int * A , size_t nb )
       { size_t i ;
         for( i = 0 ; i < nb; i++ )
         printf("%d ", A[i] ) ;
         printf("\n");
       }
     
      void main()
       { puts("Begin");
         say( Array, max ) ;
         Qsort( Array, max, sizeof(int), (comparF*) intcomp ) ;
         say( Array, max ) ;
         puts("End");
         getchar();
       }
    Si vous avez le temps proposez un autre algo sans le goto. Le quicksort n' est performant que sur des données non contigues. Pour la médiane de trois qui corrige ce défaut, on a restitué le goto à des fins opérationnelles.

    Je vous ai fait un simple copier coller.

    Salut.
    La lisibilité de ce code ne plaide pas en faveur de goto...

    Thierry

  14. #154
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    572
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Février 2007
    Messages : 572
    Points : 675
    Points
    675
    Par défaut
    Citation Envoyé par mujigka
    Je pense que si on arrive à imposer une limite quand à la taille des fonctions et qu'on parvient à maintenir ces dernières assez compactes, le premier exemple proposé est supérieur du point de vue de la lisibilité et de la facilité de maintenance, du moment que le nombre de if ... else... imbriqués reste raisonable.

    Thierry
    Avec le test des arguments, des allocations et des retours d'erreur des fonctions externes, on arrive facilement à 4 ou 5 niveaux d'imbrications, meme pour des fonctions simples. Alors, des que ca se complique un peu ... Personnellement, c'est une methode qui m'a fait pas mal souffrir.

  15. #155
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Sanguko
    Avec le test des arguments, des allocations et des retours d'erreur des fonctions externes, on arrive facilement à 4 ou 5 niveaux d'imbrications, meme pour des fonctions simples. Alors, des que ca se complique un peu ... Personnellement, c'est une methode qui m'a fait pas mal souffrir.
    Tu vas aimer :

    http://emmanuel-delahaye.developpez....theque-clib-c/

  16. #156
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 923
    Points
    17 923
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par dj.motte
    Seulement dans certains cas on le trouve pratique.


    Si vous avez le temps proposez un autre algo sans le goto. Le quicksort n' est performant que sur des données non contigues. Pour la médiane de trois qui corrige ce défaut, on a restitué le goto à des fins opérationnelles.

    Je vous ai fait un simple copier coller.

    Salut.
    Facile

    Voilà ta solution sans le goto.....

    NOTES :

    1) je n'ai rien corrigé d'autre, mais comme disent mes prédecesseurs ici, même moi qui suis habitué aux trucs de maths, c'est quasi illisible.... (mauvaises indentations, déclarations de variables etc...)

    2) je ne re-post que la routine contenant les 2 goto :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    void  qSortHelp (char *pivotP, size_t nElem)
    {   char     *leftP, *rightP, *pivotEnd, *pivotTemp, *leftTemp;
        unsigned  lNum;
        int       retval;
     
        int Statut = 1,  NextIter = 0 ;
    
    // tailRecursion:
    
        while ( Statut )
          {
    	Statut = 0 ;
    
    	//tailRecursion:
    
    	if (nElem <= 2)
    	  { if (nElem == 2)
    	      { if (Fcmp (pivotP, rightP = qWidth + pivotP) > 0)
    		  Exchange (pivotP, rightP);
    	      }
    	    return;
    	  }
     
    	rightP = (nElem - 1) * qWidth + pivotP;
    	leftP  = (nElem >> 1) * qWidth + pivotP;
    	//leftP  = (nElem / 2 ) * qWidth + pivotP;
     
    /*  sort the pivot, left, and right elements for "median of 3" */
     
    	if (Fcmp (leftP, rightP) > 0)
    	  Exchange (leftP, rightP);
    	if (Fcmp (leftP, pivotP) > 0)
    	  Exchange (leftP, pivotP);
    	else if (Fcmp (pivotP, rightP) > 0)
    	  Exchange (pivotP, rightP);
     
    	if (nElem == 3)
    	  { Exchange (pivotP, leftP);
    	    return;
    	  }
     
    /*  now for the classic Hoare algorithm */
     
    	leftP = pivotEnd = pivotP + qWidth;
    
    	NextIter = 0 ;
    
    	do {
    	  while( (retval = Fcmp(leftP, pivotP)) <= 0)
    	    { if (retval == 0)
    		{ Exchange(leftP, pivotEnd);
    		  pivotEnd += qWidth;
    		}
    	      if (_LT_ (leftP, rightP)) leftP += qWidth;
    	      else  // goto qBreak;
    		{
    		  NextIter = 1 ;
    		  break;
    		}
    	    }
    	  if ( ! NextIter ) 
    	    {	      while (_LT_(leftP, rightP))
    		{  if ((retval = Fcmp(pivotP, rightP)) < 0)
    		    rightP -= qWidth;
    		  else
    		    { Exchange (leftP, rightP);
    		      if (retval != 0)
    			{ leftP += qWidth;
    			  rightP -= qWidth;
    			}
    		      break;
    		    }
    		}
    	    }	
              } while (_LT_(leftP, rightP) && (! NextIter) );
    
      // qBreak:
    
    	if ( NextIter )
    	  {	    if (Fcmp(leftP, pivotP) <= 0)
    	      leftP = leftP + qWidth;
    	
    	    leftTemp = leftP - qWidth;
    	    pivotTemp = pivotP;
    	    while ((pivotTemp < pivotEnd) && (leftTemp >= pivotEnd))
    	      { Exchange(pivotTemp, leftTemp);
    		pivotTemp += qWidth;
    		leftTemp -= qWidth;
    	      }
     
    	    lNum = (leftP - pivotEnd) / qWidth;
    	    nElem = ((nElem * qWidth + pivotP) - leftP)/qWidth;
    	    
    	    /* Sort smaller partition first to reduce stack usage */
    	    if (nElem < lNum)
    	      { qSortHelp (leftP, nElem);
    	      }
    	    else
    	      { qSortHelp (pivotP, lNum);
    		pivotP = leftP;
    	      }
    
    	    Statut = 1 ;
    	  }
          }
    
    //   goto tailRecursion;
    
    }
    Cordialement

  17. #157
    Inactif  

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    534
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 534
    Points : 403
    Points
    403
    Par défaut
    Bonjour,

    Souviron34, j'ai testé ton algo, ça ne trie rien !
    Il y a une erreur quelque part ?

    Salut.

  18. #158
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut Re:
    Moi j'utilise pas le goto parce qu'on ne peut faire que des sauts locaux avec. Je préfère utiliser setjmp()/longjmp() qui me permet de faire des suts non-locaux (c'est-à-dire se brancher directement quelque part dans une autre fonction).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    #include <stdio.h>
    #include <setjmp.h>
     
    jmp_buf jmpbuffer;
     
    void f()
    {
    int ret;
    printf("début de la fonction f.\n");
    ret = setjmp(jmpbuffer);
    printf("fin de la fonction f avec ret = %d.\n", ret);
    }
     
    void g(int jump)
    {
    printf("début de la fonction g.\n");
    if (jump) longjmp(jmpbuffer, 2007);
    printf("fin de la fonction g.\n");
    }
     
    int main()
    {
    f();
    g(0);
    g(1);
    return 0;
    }

  19. #159
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    Par défaut
    Sauf qu'employé ainsi, y'a pas plus sale.

    Déjà qu'il est crade d'utiliser longjmp(), le strict minimum est de se limiter à des sauts vers la fonction appelante, et dans un bloc d'instruction "père" et surtout pas "oncle".

    Sinon, il peut y avoir absolument n'importe quoi dans les variables locales.

  20. #160
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Melem
    #include <stdio.h>
    #include <setjmp.h>
    Illisible.

+ Répondre à la discussion
Cette discussion est résolue.
Page 8 sur 18 PremièrePremière ... 456789101112 ... DernièreDernière

Discussions similaires

  1. Que pensez-vous des générateurs de doc PHP ?
    Par Nonothehobbit dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 64
    Dernier message: 10/07/2007, 10h17
  2. Que pensez vous de filemaker
    Par thpopeye dans le forum Autres SGBD
    Réponses: 4
    Dernier message: 14/06/2007, 15h20
  3. Que pensez vous du nouveau kernel 2.6 ?
    Par GLDavid dans le forum Administration système
    Réponses: 58
    Dernier message: 02/08/2004, 15h45
  4. [Débat] Que pensez-vous des langages à typage dynamique?
    Par Eusebius dans le forum Langages de programmation
    Réponses: 14
    Dernier message: 16/06/2004, 12h12
  5. Que pensez vous du mariage ASP Flash?
    Par tyma dans le forum Flash
    Réponses: 4
    Dernier message: 09/07/2003, 15h00

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo