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 :

go to et le c++


Sujet :

C++

  1. #21
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par toxcct
    serieusement, il est la parce que le standard ne dit pas comment l'exécution doit allouer une variable par défaut, et si un compilo veut mettre une variable dans le registre, rien ne lui empechera, sauf si on explicite "auto"
    A ma connaissance, il n'a pas cet effet la. Il n'est meme pas comme register (quelque chose devenu inutile qui ne l'a pas toujours ete) une suggestion au compilateur.

    que je ne fasse pas jeter de pierres, je ne parlais pas pour toi JM
    Je ne l'ai pas pris pour moi. Je ne crois pas avoir donne ici mon opinion sur le goto.

  2. #22
    Membre émérite
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    780
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 780
    Par défaut
    je rapelle que pour programmer haut niveau, il existe des langages meilleurs que le C/C++, mais que ceux ci en revanche ont une place manifeste dans les langages bas niveau et dans l'informatique industrielle.
    pure spéculation votre honneur! Je ne pense pas que tout le monde ici soit d'accord.

  3. #23
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par nikko34
    pure spéculation votre honneur! Je ne pense pas que tout le monde ici soit d'accord.
    oh merde, faute de frappe !!!!

    je voulait dire qu'il y a mieux que le C/C++ pour le haut niveau et l'info de gestion, quand que C/C++ garde une place prépondérante en info indus !

  4. #24
    Membre chevronné
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    394
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 394
    Par défaut
    Le goto est un atavisme de l'assembleur, il n'a quasiment plus sa place en C et encore moins en C++. Son utilisation pour sortir d'une boucle est complètement marginale. Je ne l'utiliserais que si cette boucle est un goulet d'étranglement. De plus, avant de la mettre en pratique j'aimerais voir les benchmarks avec et sans et évaluer le gain que cela représente.
    Algorithmiquement les deux méthodes suivantes font exactement le même nombre de comparaisons. La seconde faisant une N*M affectations supplémentaire dans une variable que le compilateur assignera probablement dans un registre.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    bool found = false;
    for (int i=0; (i<M) && (!found); ++i)
    {
      for (int j=0; j<N; ++j)
      {
        found = (A[N*i+j]==a);
      }
    }
    ----------------------
    for (int i=0; i<M; ++i)
      for (int j=0; j<N; ++j)
        if (A[N*i+j]==a) goto found;
    }
    De toute les manières ce n'est pas une pratique à encourager à quelqu'un qui commence le C ou le C++. Cette solution brise le flot d'exécution normal, masque le véritable algorithme et induit des risques d'erreurs de maintenance.
    Si j'ai 10 boucles de ce genres, je dois fixer à la main 10 labels différents (found1, found2, found3...), que se passe-t-il quand je fais du 'refactoring' et que je déplace une boucle d'une autre unité de compilation ? Ou bien que j'intervertisse quelques lignes de code aux environs de l'étiquettes ?
    Déjà il y a 20 ans, il y avait des tonnes de mise en garde contre le 'goto' en basique. On préconisait de le bannir au profit des 'gosub'. Ce n'est sûrement pas pour le réintroduire maintenant.

    En assembleur le goto est indispensable, très bien. Justement son emploi principal est de mettre en oeuvre des boucles et des appels de routines. Si je programme en C c'est justement pour me faciliter le travail et ne pas gérer ces problèmes de sauts conditionnels et d'étiquettes. 'goto' je ne l'ai employé que quand je programmais des drivers, dans du C qui contenait allègrement 60% d'assembleur. Sûrement pas pour faire des boucles imbriquées.

    Ensuite, je ne prend pas Stroustrupt pour un imbécile. Cependant, je me méfie des exemples et des citations extraites de leur contexte. Je doute profondémment que Stroustrupt milite pour l'usage systématique des 'goto' pour sortir d'une boucle multiple.

    Bref, cette solution n'est en aucun cas plus élégante, ni efficace. Je crois que son seul mérite c'est de faire l33t HaXXor, mais ce n'est en aucun cas à employer dans du développement sérieux.

    @toxcct: Si j'interviens dans ces forums c'est dans un but purement altruiste. J'accepte toute critique, mais sûrement pas de me faire traiter de 'fachiste' par quelqu'un que je ne connais ni d'Eve ni d'Adam.

  5. #25
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par Jan Rendek
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    bool found = false;
    for (int i=0; (i<M) && (!found); ++i)
    {
      for (int j=0; j<N; ++j)
      {
        found = (A[N*i+j]==a);
      }
    ----------------------
    for (int i=0; i<M; ++i)
      for (int j=0; j<N; ++j)
        if (A[N*i+j]==a) goto found;
    }
    Un argument en faveur du goto, c'est que ca fait deux fois que tu te plantes en essayant de montrer un code equivalent. Au moins, la premiere fois, le probleme etait moins grave, ici, tu n'as meme pas un bon resultat.

  6. #26
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Jan Rendek
    @toxcct: Si j'interviens dans ces forums c'est dans un but purement altruiste. J'accepte toute critique, mais sûrement pas de me faire traiter de 'fachiste' par quelqu'un que je ne connais ni d'Eve ni d'Adam.
    tu prend ma phrase hors contexte, et je ne parle surement pas de politique ici. "faschiste", c'etait pour dire que tu as une facon de pensée a mon avis tres "droite", que tu ne t'en écarte jamais, et limite que tu n'accepte pas les remarques et critiques. voila le seul sens dans lequel j'ai dit ce mot.

  7. #27
    Membre chevronné
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    394
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 394
    Par défaut
    Je te retourne le compliment. Mon propos s'adresse uniquement à l'égard de ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Y'a quand même UN cas de figure en C/C++ où le goto est intéressant: une sorte de 'break' pour sortir de multiples boucles.
    Certes des alternatives existent, mais c'est plus lent...
    Et non pas de l'ablation pure et simple de 'goto', ni de l'info indus ou que sais-je encore.

  8. #28
    Inactif  
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    743
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 743
    Par défaut
    Citation Envoyé par Jean-Marc.Bourguet
    Un argument en faveur du goto, c'est que ca fait deux fois que tu te plantes en essayant de montrer un code equivalent. Au moins, la premiere fois, le probleme etait moins grave, ici, tu n'as meme pas un bon resultat.
    Bien vu!! Je prenais même pas la peine de décortiquer son algo...
    Voici une jolie preuve de l'utilité du goto...

    Citation Envoyé par Jan Rendek
    Je te retourne le compliment. Mon propos s'adresse uniquement à l'égard de ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Y'a quand même UN cas de figure en C/C++ où le goto est intéressant: une sorte de 'break' pour sortir de multiples boucles.
    Certes des alternatives existent, mais c'est plus lent...
    Et non pas de l'ablation pure et simple de 'goto', ni de l'info indus ou que sais-je encore.
    Stroustrup l'exprimait mieux que moi, je te le recite:
    Il existe peu d'applications pour goto en programmation générale de haut niveau. Cette instruction peut en revanche se révéler très pratique lorsque le code C++ est généré par un programme plutôt qu'écrit directement par un programmeur. il est possible de voir des goto, par exemple, dans un analyseur syntaxique généré à partir d'une grammaire depuis un générateur d'analyseur [NDL Bison]. Un goto peut également être important dans les cas rares pour lesquels une efficacité optimale est indispensable (dans la boucle intérier d'une application temps réel, par exemple)

    L'une des applications les plus judicieuses de cette instruction consiste à sortir d'une boucle imbriquée ou d'une instruction switch (un break ne permet de remonter qu'un seul niveau de boucle ou d'instruction switch). Par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    void f()
    {
      int i;
      int j;
      for (i=0; i<n; ++i)
        for (j=0; j<m; ++j)
          if (nm[i][j]==a) goto found;
      // introuvable
      //...
      found:
      //nm[i][j]==a 
    }

  9. #29
    Membre chevronné
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    394
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 394
    Par défaut
    Je ne vois pas en quoi cela contredit mon propos.
    Son utilisation pour sortir d'une boucle est complètement marginale. Je ne l'utiliserais que si cette boucle est un goulet d'étranglement. De plus, avant de la mettre en pratique j'aimerais voir les benchmarks avec et sans et évaluer le gain que cela représente.
    Pour le coup, je suis curieux du gain en rapidité. Je vais tester ça, je posterais les résultats ici.

  10. #30
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,

    L'instruction goto est, sans doute, l'une des instructions qui se retrouvent dans le plus grand nombre de langages de programmation, et pour cause: c'est une des réminiscence importante du langage machine/assembleur.

    Il faut bien etre conscient que toutes les possiblités offertes par la programmation structurée et orientée objet ne sont, en définitive, que des goto "déguisés" - qu'il s'agisse des tests, des boucles, de la gestion d'erreur ou des phénomènes d'héritage/de polymorphisme...

    Alors, évidemment, goto n'est absolument pas propre au C++, ce qui était quand meme, semble-t-il, le but du sujet

    Par contre, oui, goto existe en C++, et dans la plupart des langages de programmation d'ailleurs, mais, non, ce n'est absolument pas une raison pour l'utiliser.

    Sans atteindre l'extrémisme de certains profs qui iront jusqu'à vous menacer de vous jeter par la fenetre si vous osez utiliser goto dans un programme, il faut malgré tout etre conscient que dans la très grosse majorité des cas, son utilisation peut etre évitée, au besoin, en modifiant l'algorithme qui nous incite à l'utiliser...

    La beauté de la programmation structurée est qu'elle permet la "factorisation" d'un bloc d'instructions, voire, de décider à n'importe quel moment de déplacer ce bloc d'instructions pour une raison ou une autre.

    De plus, la programmation structrée offre l'énorme avantage de présenter le code source sous une forme identique à ce que l'on a l'habitude de lire: un livre ou un journal, que l'on lit de "haut en bas" et "de gauche à droite".

    Le goto présente quant à lui l'énorme inconvéniant de "casser" l'ordre logique de lecture d'une programmation structurée, principalement quand on se trouve face à une accumulation de goto ou face à des goto "montants".

    La conséquence quasi inévitable est que la lecture du code devient beaucoup plus compliquée, ce qui entraine une perte de temps énorme, et sans commune mesure avec le gain de temps (dont j'attendrai la preuve qu'il est réel) occasionné par les goto lorsqu'il s'agit de modifier le code...
    Citation Envoyé par toxcct
    si le goto est completement futile, pourquoi bigre fait-il parti du langage, nom de dieu !?
    Parce qu'il s'agit d'une réminisence des langages datant d'avant les langages de troisième génération, et que certains "vieux" programmeurs n'ont connu que cette manière pour travailler...

    Mais personnellement, je n'aurais absolument rien contre un langage qui ne disposerait meme pas de cette instruction qui, bien pis que d'être futile, présente d'énormes inconvéniants et est dans la grosse majorité des cas remplacable par quelque chose qui permettra de rendre le code plus compréhensible
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  11. #31
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par koala01
    Parce qu'il s'agit d'une réminisence des langages datant d'avant les langages de troisième génération, et que certains "vieux" programmeurs n'ont connu que cette manière pour travailler...
    Donc la, tu prends Stroustrup pour un vieux qui n'a pas sufaire la part des choses ? je suis d'accord avec tout ton discours, sauf ici !

  12. #32
    Membre émérite
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    780
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 780
    Par défaut
    Soustrup commence par:

    "C++ possesses the infamous goto"

    ensuite:

    L'une des applications les plus judicieuses de cette instruction consiste à sortir d'une boucle imbriquée ou d'une instruction switch (un break ne permet de remonter qu'un seul niveau de boucle ou d'instruction switch).
    en anglais c'est "one of the few sensible uses of goto in ordinary code", c'est à dire que des applications judicieuses (littéralement, "sensées") dans le code de tous les jours, il y en a pas beaucoup.

    Sinon, dans le reste de son bouquin, il ne l'utilise pas. Ca doit vouloir dire quelque chose.

  13. #33
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par nikko34
    Soustrup commence par:

    "C++ possesses the infamous goto"

    ensuite:

    en anglais c'est "one of the few sensible uses of goto in ordinary code", c'est à dire que des applications judicieuses (littéralement, "sensées") dans le code de tous les jours, il y en a pas beaucoup.

    Sinon, dans le reste de son bouquin, il ne l'utilise pas. Ca doit vouloir dire quelque chose.
    merci pr la traduction.
    je disais juste, en tout conscience de cette citation, que malgré tout la sympathie qu'il a pour le goto, il l'a quand meme incorporé au C++, ce qui est un signe malgré tout du minimum d'interet qu'on devrait avoir a son égard.
    le probleme ne vient pas du goto mais de la mauvaise utilisation que des boulets en font, c'est pas plus compliqué que ca

  14. #34
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par toxcct
    que malgré tout la sympathie qu'il a pour le goto, il l'a quand meme incorporé au C++,
    Le C++ a hérité le goto du C.

    ce qui est un signe malgré tout du minimum d'interet qu'on devrait avoir a son égard.
    minimum est le mot.

    le probleme ne vient pas du goto mais de la mauvaise utilisation que des boulets en font, c'est pas plus compliqué que ca
    Tu peux expliquer comment tu reconnais une bonne utilisation d'un goto d'une mauvaise?

  15. #35
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Jean-Marc.Bourguet
    Tu peux expliquer comment tu reconnais une bonne utilisation d'un goto d'une mauvaise?
    Relis la discussion...

  16. #36
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par toxcct
    Relis la discussion...
    Quel message dans la discussion donne un critère effectif pour savoir si un goto est un "bon" goto ou un "mauvais"?

  17. #37
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Citation Envoyé par toxcct
    Donc la, tu prends Stroustrup pour un vieux qui n'a pas sufaire la part des choses ? je suis d'accord avec tout ton discours, sauf ici !
    Meme les meilleurs peuvent avoir leurs moments d'égarement

    Et tu tires malgré tout des conclusions un peu hâtives suite à une mauvaise interprétation de mes écrits...

    Ce que je voulais dire, c'est qu'il y a d'anciens codes (pas *forcément* en C++) pour lesquels les goto sont mangés à toutes les sauces...

    Ne riez pas: je connais quelqu'un qui a rencontré un code composé de ... 20 goto sur... meme pas une centaine de lignes

    Quand on en arrive à ce point, c'est que, visiblement, il y a un malaise quelque part, non

    En sommes, il s'agit surtout de l'expression de la mise en oeuvre d'une méthode d'algorithmie particulièrement inadaptée au langage de troisième génération (le flowchart, pour ne pas le nommer) qui devrait n'être réservé que dans le cadre d'une programmation en assembleur ou en langage machine...

    Dans quelques cas extrèmement rares et très précis, on *peut* concevoir que le goto soit une alternative valable, mais, à ce jour, j'ai toujours su faire sans...

    Un exemple parmis tant d'autres, en C, dans lequel l'utilisation du goto *peut* sembler adaptée:
    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
     
    int** mafonct(int n1,int n2)
    {
        int** temp;
        int i;
        int j;
        temp=malloc(sizeof(int*)*n1);
        if(temp==NULL)
            goto Err1;
        for(i=0;i<n1;i++)
        {
            temp[i]=malloc(sizeof(int)*n2);
            if(temp[i]==NULL)
                goto Err2;
        }
        return temp;
        Err2:
        for(j=0;j<i;j++)
            free(temp[j]);
        Err1:
            free(temp);
        return NULL;
    };
    Et, pourtant, un algorithme très légèrement différent permettra de s'en passer:
    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
     
    int** fonct2(int n1,int n2)
    {
        int errcode=0;
        int i;
        int j;
        int** temp;
        temp=malloc(sizeof(int*)*n1);
        if(temp==NULL)
            errcode=1;
        else
        {
            while(errcode==0 && i<n1)
            {
                temp[i]=malloc(sizeof(int)*n2);
                if(temp[i]==NULL)
                    errcode=2;
                else
                    i++;
            }
        }
        switch(errcode)
        {
            case 2:
                for(j=0;j<i;j++)
                    free(temp[i]);
            case 1:
                free(temp);
                temp=NULL;
                break;
        }
        return temp;
    }
    Les deux codes sont exactement équivalents: il alloue tous les deux la mémoire pour une matrice d'entier de n1 lignes et de n2 colones...


    La seule chose, c'est que le premier brise l'ordre logique d'exécution, alors que le second la respecte entièrement...

    Je ne considère nullement Stroutrup comme un "vieil imbécile qui n'a pas su faire la part des choses" parce qu'il a inclu l'instruction goto dans son langage: son but premier était de créer un langage qui dépayserait le moins possible les codeurs habitués au C, et il est donc logique (quoi qu'on puisse estimer que c'est un mauvais service rendu) qu'il ai fourni une instruction qui, elle, est utilisée principalement par de vieux imbéciles qui ne font pas la part des choses

    Il a d'ailleurs si bien fait la part des choses qu'il ne l'utilise dans son bouquin que.. quand il parle de l'instruciton

    Heuu... comprenons nous bien (sinon, bientot, on m'accusera de considérer linus tovald comme un vieil imbécile ) je retire du lot tous ceux qui, en connaissance de cause, utilisent le goto dans la très rare portion des fois où il s'avère nécessaire

    Parfois, mais ca représente vraiment une partie infinitésimale des cas où le goto pourrait sembler intéressant, il apparait qu'il est définitivement la meilleure solution à un problème donné... et, dans ce cas, nécessité fait loi, il reste donc logique de l'utiliser...
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  18. #38
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par koala01
    En sommes, il s'agit surtout de l'expression de la mise en oeuvre d'une méthode d'algorithmie particulièrement inadaptée au langage de troisième génération (le flowchart, pour ne pas le nommer) qui devrait n'être réservé que dans le cadre d'une programmation en assembleur ou en langage machine...
    Même en assembleur on peut programmer de manière structurée.

    Dans quelques cas extrèmement rares et très précis, on *peut* concevoir que le goto soit une alternative valable, mais, à ce jour, j'ai toujours su faire sans...
    On peut toujours faire sans, c'est démontré quelque part. Au pire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    state = 1;
    switch(state) {
    case 1: ...; state++;
               break;
    case 2:  state = 6;
                break;
    ...
    }
    Et même si le goto n'est plus là, le problème lui est resté.

    Un exemple parmis tant d'autres, en C, dans lequel l'utilisation du goto *peut* sembler adaptée:
    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
     
    int** mafonct(int n1,int n2)
    {
        int** temp;
        int i;
        int j;
        temp=malloc(sizeof(int*)*n1);
        if(temp==NULL)
            goto Err1;
        for(i=0;i<n1;i++)
        {
            temp[i]=malloc(sizeof(int)*n2);
            if(temp[i]==NULL)
                goto Err2;
        }
        return temp;
        Err2:
        for(j=0;j<i;j++)
            free(temp[j]);
        Err1:
            free(temp);
        return NULL;
    };
    Et, pourtant, un algorithme très légèrement différent permettra de s'en passer:
    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
     
    int** fonct2(int n1,int n2)
    {
        int errcode=0;
        int i;
        int j;
        int** temp;
        temp=malloc(sizeof(int*)*n1);
        if(temp==NULL)
            errcode=1;
        else
        {
            while(errcode==0 && i<n1)
            {
                temp[i]=malloc(sizeof(int)*n2);
                if(temp[i]==NULL)
                    errcode=2;
                else
                    i++;
            }
        }
        switch(errcode)
        {
            case 2:
                for(j=0;j<i;j++)
                    free(temp[i]);
            case 1:
                free(temp);
                temp=NULL;
                break;
        }
        return temp;
    }
    Les deux codes sont exactement équivalents: il alloue tous les deux la mémoire pour une matrice d'entier de n1 lignes et de n2 colones...
    Qu'est-ce que je disais... on transforme un état implicite donné par la position en un état explicite donné par une variable sans rien changé au déroulement du programme. Les deux versions ont exactement les mêmes défauts. Le problème fondamental du goto, c'est un problème de difficulté à raisonner sur les programmes qui l'emploient. Et jouer avec des variables sans rien changer au déroulement ne change pas cette difficulté.

  19. #39
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Citation Envoyé par toxcct Voir le message
    il existe cependant de tres rares cas où le goto est utile, notamment pour des problemes de performance quand on veut sortir de plusieurs boucles imbriquées. Dans un tel cas, le break est inefficace car il ne faire ressortir que d'un niveau (et donc pas de toutes les boucles).
    Je ne suis jamais tombé sur un cas où l'utilisation d'un return, précédé éventuellement d'un redécoupage en fonction ne s'est pas traduit par du code plus lisible qu'un goto.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  20. #40
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par JolyLoic Voir le message
    Je ne suis jamais tombé sur un cas où l'utilisation d'un return, précédé éventuellement d'un redécoupage en fonction ne s'est pas traduit par du code plus lisible qu'un goto.
    redécouper en fonctions implique un cout de performance pour les appels ou de mémoire dans le cas d'inline...

    je n'ai pas dit que c'était toujours vrai, j'ai dit qu'il existe de tres rares cas ou le goto peut éventuellement servir.

    ne me fait pas dire ce que je n'ai pas dit, j'ai le goto en horreur.

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