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 : 51
    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