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. #101
    Membre averti Avatar de Jack_serious
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    350
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 350
    Points : 396
    Points
    396
    Par défaut
    Citation Envoyé par mujigka
    Moi non plus j'aime pas les goto... il fut un temps où je les virais... Pourtant y'a pas que lui qui n'est pas structuré :
    Mais dans un switch() case: break...
    Je trouve tout de même une instruction switch beaucoup plus structurée qu'un goto. Contrairement au goto, je ne trouve pas qu'elle nuit à la lisibilité du code. Perso, je n'ai jamais utilisé la possibilité offerte par goto.

    Meilleures salutations

    Thierry
    Idem, je n'ai plus utilise un seul goto depuis le temps ou je programmais en Basic sur ma calculatrice sur les bancs du lycee... (aaah les cours de physique).
    Et je m'en porte tres bien.

  2. #102
    Nouveau membre du Club
    Profil pro
    responsable de développement
    Inscrit en
    Février 2006
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : responsable de développement

    Informations forums :
    Inscription : Février 2006
    Messages : 26
    Points : 34
    Points
    34
    Par défaut
    OK pour le Goto, ce n’est pas beau…

    Mais quand on parle de structure (voir réponse de Vic sur les break, continue, return…) je suis entièrement d’accord… et donc ce n’est pas la seule réponse pour ne pas utiliser le Goto.

    Le seul langage qui respecte le flux de programmation… c’est le Lisp et ces dérivés… Pratiquez-le un peu (et même beaucoup) et vous connaîtrais les contraintes d’un respect des flux…

  3. #103
    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
    Le seul langage qui respecte le flux de programmation… c’est le Lisp et ces dérivés… Pratiquez-le un peu (et même beaucoup) et vous connaîtrais les contraintes d’un respect des flux…
    Un code C bien structuré qui n'utilise pas de goto et qui n'abuse pas de la compilation conditionnelle respecte à mon sens relativement bien le flux de programmation. Qu'est-ce que Lisp a de plus à ce niveau? J'ai beaucoup de problème avec la synthaxe du LISP (et j'ai très peu d'expérience en programmation fonctionnelle), mais c'est vrai que je ne me suis pas acharné non plus. Je vais étudier cela de plus près.

    Meilleures salutations

    Thierry

  4. #104
    Membre habitué
    Inscrit en
    Mai 2005
    Messages
    335
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 335
    Points : 196
    Points
    196
    Par défaut
    Citation Envoyé par argoet
    La regle : Pas de goto dans un programme

    La valeur d'un programmeur est inversement proportionnel au nombre de goto que l'on trouve dans son code

    Pour clarifier ton programme Utilise les sous programmes avec les commentaire qui vont bien
    entierement d'accord avec cette regle goto est une aberation..

  5. #105
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    154
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 154
    Points : 160
    Points
    160
    Par défaut
    bon dsl j'ai pas tout lu donc ça a peut etre deja été dit, mais il y a toujours l'argument d'autorité :

    Dijkstra a dit que goto c'est mal :
    http://www.acm.org/classics/oct95/

    Et moi je lui fait confiance

  6. #106
    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
    Dijkstra a dit que goto c'est mal :
    http://www.acm.org/classics/oct95/

    Et moi je lui fait confiance
    Ca c'est tout de même limité comme réflexion. Il faut se méfier des gourous et de leurs dogmes. En l'occurence, tu fais bien de lui faire confiance.

    Thierry

  7. #107
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    154
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 154
    Points : 160
    Points
    160
    Par défaut
    hm c'est pas si limité que ça, Dijkstra est un chercheur connu, et je m'appuis sur ses résultats... c'est une démarche courante

  8. #108
    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
    C'était juste la façon dont tu l'a dit! Je ne met pas en doute ses dires, d'autant plus que je suis d'accord.

    Salutations

    Thierry

  9. #109
    Membre à l'essai
    Inscrit en
    Février 2006
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 31
    Points : 22
    Points
    22
    Par défaut Re: Goto or not goto?
    Personellement j trouve que goto est indique pour resoudre uncertain nombre de problemes et notament ceux de saut d'instruction et j ne comprend pas non plus pourquoi elle sucite tant de crainte. une fois qu'on sait comment ca marche ce n'est plus du tou illisible je trouve.

  10. #110
    Membre actif

    Inscrit en
    Décembre 2005
    Messages
    260
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 260
    Points : 208
    Points
    208
    Par défaut
    je pense su'on doit profiter des avantages de la programmation structuré et ne pas abusé des goto.Car sutout pr les gens qui ont deja programmer en assembleur on peut simuler des tests des boucles jsute avec les gotos et le code et ne pas du tout claire et s'est en plus en plus difficile pr le maintenir ou le corriger.

  11. #111
    Membre expérimenté Avatar de 10_GOTO_10
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    887
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 887
    Points : 1 531
    Points
    1 531
    Par défaut
    Bon, vu mon pseudo, je ne peux pas ne pas me mêler au débat. Vous l'aurez compris, j'ai fait du basic et de l'assembleur (donc, je suis définitivement perdu pour l'informatique, dirait mon prof).

    Est-ce que les anti-gotos pourraient me dire comment faire le programme suivant sans goto ?

    Soit le programme VHDL suivant (pas de panique, même si vous ne connaissez pas le VHDL, vous comprendrez quand même):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    procedure TITI
      begin
      -- traitement
      wait on A
      -- suite du traitement
    end procedure
    Le VHDL est fait pour décrire des composants indépendants, donc chaque procédure tourne en parallèle.
    Je voudrais faire un programme C (séquentiel, donc) qui simule ces composants. J'ai donc une fonction principale qui appelle chaque procédure alternativement. Sur le "wait on A", la procédure redonne la main à la boucle principale (donc un return), puis doit continuer le traitement à l'endroit où elle s'est interrompue quand le signal A (une variable globale, pour simplifier) est modifiée. Ca donne ceci en c:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    int TITI(int suivi)
      {
      if (suivi == 1) goto suivi1;
      // Traitement
      // Equivalent du wait on A
      return;
    suivi1:
      // Suite du traitement
      }
    Je ne vois pas bien comment faire ce type de programme sans gotos, à moins de faire autant de threads que de procédures, sachant qu'on va vite être limité par le nombre maxi de threads autorisés par le système.

    Mais je suis sûr que les anti-gotos vont me donner une solution élégante, structurée, et sans gotos...

  12. #112
    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 10_GOTO_10
    Mais je suis sûr que les anti-gotos
    Argh ! Je suis repéré !
    vont me donner une solution élégante, structurée, et sans gotos...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    int TITI(int suivi)
    {
       if (suivi != 1)
       {
         // Traitement
         // Equivalent du wait on A
       }
       else
       {
         // Suite du traitement
       }
       return ...;
    }
    Trop simple. j'ai sans doute rien compris...

  13. #113
    Membre expérimenté Avatar de 10_GOTO_10
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    887
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 887
    Points : 1 531
    Points
    1 531
    Par défaut
    Oui, c'est pas si simple: le wait peut être inclus dans des boucles et/ou dans des if (c'est à dire que le begin du if est dans Traitement et le end du if est dans SuiteTraitement). Il peut aussi bien sûr y avoir d'autres wait à d'autres endroits.

  14. #114
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par 10_GOTO_10
    Oui, c'est pas si simple: le wait peut être inclus dans des boucles et/ou dans des if (c'est à dire que le begin du if est dans Traitement et le end du if est dans SuiteTraitement). Il peut aussi bien sûr y avoir d'autres wait à d'autres endroits.
    Je ne vois pas en quoi goto aide. Si j'ai bonne memoire, on ne peut pas faire de goto vers l'interieur de structure de controle en C (ou bien est-ce uniquement en C++?).

    De toute maniere pour implementer l'equivalent de wait, il te faut des coroutines puisqu'il peut y avoir toutes les variables de la pile d'appel a stocker. Si tu veux le gerer en C, il faut faire pas mal de chose a la main. Tellement que j'aurais tendance a definir un preprocesseur specialise pour ca, ou a tout le moins une lib complete bien pensee ce qui serait aussi du boulot. Pourquoi ne pas utiliser un vrai simulateur VHDL? Ou Verilog. Ou System C.

  15. #115
    Membre expérimenté Avatar de 10_GOTO_10
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    887
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 887
    Points : 1 531
    Points
    1 531
    Par défaut
    Citation Envoyé par Jean-Marc.Bourguet
    (ou bien est-ce uniquement en C++?).
    Heu, oui. je suis effectivement en C++. Ca ne change rien au débat.

    Citation Envoyé par Jean-Marc.Bourguet
    De toute maniere pour implementer l'equivalent de wait, il te faut des coroutines puisqu'il peut y avoir toutes les variables de la pile d'appel a stocker.
    Non, en VHDL toutes les variables sont statiques (on ne peut pas créer un bout de fil dans un composant et le détruire). J'espère qu'il n'y a pas de spécialiste VHDL dans le forum, je ne suis pas absolument sûr de ne pas dire une bêtise.

    Citation Envoyé par Jean-Marc.Bourguet
    Pourquoi ne pas utiliser un vrai simulateur VHDL? Ou Verilog. Ou System C.
    Alors celle là elle n'est pas mal: "N'UTILISEZ PAS DE GOTO !!! CHANGEZ DE COMPILATEUR AU BESOIN, MAIS SURTOUT N'UTILISEZ PAS DE GOTO !!!"

  16. #116
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par 10_GOTO_10
    Citation Envoyé par Jean-Marc.Bourguet
    (ou bien est-ce uniquement en C++?).
    Heu, oui. je suis effectivement en C++. Ca ne change rien au débat.
    Je faisais allusion au fait qu'en C++ on ne peut pas faire de goto après une déclaration (et je me trompais car je pensais qu'on ne pouvais pas entrer dans un bloc quel qu'il soit). Ca montre que j'utilise peu les goto. Très peu.

    Citation Envoyé par 10_GOTO_10
    Citation Envoyé par Jean-Marc.Bourguet
    De toute maniere pour implementer l'equivalent de wait, il te faut des coroutines puisqu'il peut y avoir toutes les variables de la pile d'appel a stocker.
    Non, en VHDL toutes les variables sont statiques (on ne peut pas créer un bout de fil dans un composant et le détruire). J'espère qu'il n'y a pas de spécialiste VHDL dans le forum, je ne suis pas absolument sûr de ne pas dire une bêtise.
    Tu peux avoir des variables dans les fonctions et les procédures. Mais je ne sais plus si tu peux avoir des wait dedans (cela fait un peu trop longtemps et j'ai surtout fait de la synthèse RTL où la syntaxe est plus contrainte qu'en simulation; en synthèse RTL, tu ne peux avoir qu'un wait par process et ce doit être le premier statement du process.).

    Citation Envoyé par Jean-Marc.Bourguet
    Pourquoi ne pas utiliser un vrai simulateur VHDL? Ou Verilog. Ou System C.
    Alors celle là elle n'est pas mal: "N'UTILISEZ PAS DE GOTO !!! CHANGEZ DE COMPILATEUR AU BESOIN, MAIS SURTOUT N'UTILISEZ PAS DE GOTO !!!"
    C'est plus que changer de compilateur, c'est changer de language. Utiliser un language adapté plutôt qu'un avec lequel il faut bricoler pour manipuler les concepts, ça me semble être la base.

    Les goto ne me gène pas. Je vais les utiliser s'ils correspondent à mon besoin. Je vais les utiliser pour bâtir la primitive adéquate. Mais je ne vais pas m'acharger à utiliser un langage qui ne propose pas la primitive sur laquelle toute ma conception est bâtie. Si je ne manipule que des coroutines, j'utiliserai un langage avec des coroutines, si je ne manipule que des machine d'états, j'utilise un générateur qui prend une description de machine d'états. Ou alors je bâtit ou j'utilise une bibliothèque de manipulation de coroutine ou de machine d'états (ce qui revient à utiliser un langage, la frontière entre les deux est fort poreuse). Si je n'ai qu'une routine, qu'une machine d'états, oui là je vais utiliser des goto de manière locale (encore que pour des coroutines, je crois qu'un switch est plus adapté).

  17. #117
    Membre expérimenté Avatar de 10_GOTO_10
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    887
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 887
    Points : 1 531
    Points
    1 531
    Par défaut
    Citation Envoyé par Jean-Marc.Bourguet
    Les goto ne me gène pas. Je vais les utiliser s'ils correspondent à mon besoin.
    C'est uniquement ce que je voulais dire à travers cet exemple (peut-être pas très bien choisi, j'aurais pu choisir un autre language, on est d'accord).
    Je voulais seulement répondre aux inté... heu, intransigeant du C qui édictent des règles absolues, "les char *, c'est mal", "les goto, on peut toujours s'en passer", etc, etc. l'informatique en général et un language en particulier, c'est un outil. Il faut en utiliser les fonctionnalités qu'ils offrent, de la meilleure façon pour chaque cas, mais sans a priori sur la façon de faire. L'important est: 1) que ça marche. 2) que ce soit clair pour celui (sans doute soi-même) qui va le relire.

  18. #118
    Rédacteur

    Avatar de loka
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2004
    Messages
    2 672
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 672
    Points : 5 509
    Points
    5 509
    Par défaut
    je vais rajouter 3/ que ça nuit pas à la securité

    il est vrai qu'à une epoque on ne pouvait pas s'en passer (mon vieux basic :p), mais maintenant en C/C++, tout peut se faire sans goto en ameliorant le code et sa securité.
    Alors pourquoi vouloir continuer à l'utiliser ?

    Enfin bon je l'utilisais quand j'etais très jeune sur les vieux langages de programmation, mais ensuite quand on m'a appris a programmer en C, on m'a toujours banni de les utiliser sous peine d'être flagelé

  19. #119
    Nouveau membre du Club
    Profil pro
    responsable de développement
    Inscrit en
    Février 2006
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : responsable de développement

    Informations forums :
    Inscription : Février 2006
    Messages : 26
    Points : 34
    Points
    34
    Par défaut
    Salut,

    J'ai plusieurs fois était confronté a ce genre de problème en reprenant du code existant, et en voulant supprimer les 'goto ERROR' (qui ne gêné que moi entre autre!) ...

    Une solution est de decouper la 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
    bool TITI_Process(int suivi, int &rtVal) {
      if (suivi == 1) return true; // pour suite de traitement...
      // Traitement
      // Equivalent du wait on A 
      rtVal = valeurderetour;
      return false; // sans suite du traitement...
    }
     
    int TITI(int suivi) {
      int rtVal;
      if (TITI_Process(suivi)) {
         // Suite du traitement...
         // affectation éventuelle du rtVal...
      }
      return rtVal;
    }
    Le code de base n'est pas suffisamment clair... on doit pourvoir le faire en une seule fonction je comprend que l'on est dans une boucle ?
    un essai:
    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
    int TITI(int suivi) 
    { 
      bool suite=false, end=false;
     
      while (!suite && !end) {
        if (suivi == 1) {
          suite = true;
          break;
        } 
        // Traitement... 
        // Equivalent du wait on A 
        break;   // ==> return; 
      } 
      if (suivi && suite) { 
        // Suite du traitement 
      }
    }
    Mais bon... a chacun ces méthodes de codage, l'essentiel c'est d'être assez clair pour des évolutions ou des corrections de Bugs et ça aussi bien par qq'un d'autre.

  20. #120
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 12
    Points : 17
    Points
    17
    Par défaut Le goto peut etre pratique
    Le goto peut etre tres pratique mais doit etre utilisé avec soin. Il est notamment tres pratique pour la gestion d'erreur. Il permet notamment de creer un bloc pour les gestions d'erreurs et de centraliser la desallocation de ressources sur sortie d'erreur. En cas d'erreur il suffit de faire un goto sur un label a la suite duquel on procede à la desallocation et à la sortie de fonction. Cependant une regle pratique est d'éviter de faire un goto qui remonte le flot d'instruction, ce qui peut conduire a des cas délicats.

+ Répondre à la discussion
Cette discussion est résolue.
Page 6 sur 18 PremièrePremière ... 234567891016 ... 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