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 :

LE cas où le GOTO est nécessaire ?


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2016
    Messages : 3
    Par défaut LE cas où le GOTO est nécessaire ?
    bonjour
    Je fais du c++ depuis déjà un moment je suis tombé sur un os pour un projet (un drone autonome):
    quand je communique avec mon module wifi, je n'ai pas besoin de paralyser tout le programme pour attendre sa réponse

    donc dans ma fonction de mise_a_jour, j'envoie un message et je repart dans la boucle stabiliser mon drone

    mais, quand je reçois la réponse, il faut que je reprenne là ou je me suis arrêté dans mise_a_jour.... ça ressemble beaucoup à un GOTO !!!

    mais on m'a toujours dit de ne jamais utiliser de goto pour des raisons évidentes, auriez vous une solution pour les remplacer ?

    ps1 : mon programme doit être très rapide, je suis sur un ARM donc pas de switch avec un case pas ligne...
    ps2 : ce code n'est clairement pas fonctionnel, c'est juste pour vous donner une idée du problème, il faut que je revoie le type de emplacement_actuel


    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
     
    void loop() 
    {
      //plein d'instructions
     
      wifi.loop();
    }
     
    class wifi
    {
      public:
        void loop();
     
      private:
        void reception();
        void mise_a_jours();
        String emplacement_actuel;
    };
     
    void wifi::loop();
    {
      if (attente de réponse ) reception();
     
      else mise_a_jours();
    }
     
    void wifi::reception()
    {
      if( la réponse n'est pas arrivée )
      {
        return(0);
      }
      else
      {
        goto(emplacement_actuel);
      }
    }
     
    void wifi::mise_a_jours()
    {
      emplacement_actuel = "flag1:"
      write_serie("hey");
      return
      flag1:
      emplacement_actuel = "flag2:"
      write_serie("ho");
      return
      flag2:
      emplacement_actuel = "flag3:"
      write_serie("hey");
      return
      flag3:
    }
    Vous pouvez ragez sur le goto mais si vous avez mieux, je prend !

  2. #2
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Et pourtant, switch serait le plus efficace.
    Il faut bien réaliser que switch, break, continue, et même l'accolade fermante d'une boucle, sont compilés par un goto.

    Le problème principal d'un goto, c'est qu'on peut faire n'importe quoi avec, et que c'est vraiment difficile de s'en apercevoir.

    Utilise une enum plutot que des strings.
    tu pourrais avoir des pointeurs de fonctions membres.

    D'une manière générale, la performance s'améliore après mesure, jamais avant.

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    Et ça marche ça ?!?
    Parce que goto, il attend un label, et ça n'a strictement rien à voir avec une string. Donc ton code, j'ai surtout bien envie de dire qu'il ne marche pas du tout.
    Ce que tu veux faire c'est une bête machine à état, un enum, un switch, chaque case est un état.
    Quant à la rapidite.. un switch case c'est (le plus souvent?) une table et un jump, donc instant, la comparaison de string par contre..
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  4. #4
    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,

    Je code depuis ... oufff, un sérieux bail maintenant, dans différents langages de programmation, même si je me suis peu à peu spécialisé en C++ et je peux t'assurer que je n'ai jamais été dans une situation dans laquelle le recours à un goto pouvait s'avérer nécessaire.

    Je suis donc tout à fait de l'avis de mes collègues : une énumération et un swich... case semble beaucoup plus adapté, et sera -- quoi qu'il en soit -- toujours plus sécurisant qu'un goto qui risque de transformer ton code en un immonde plat de spagettis (et qui, de plus, risque de te faire faire n'importe quoi).
    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

  5. #5
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2016
    Messages : 3
    Par défaut
    Merci beaucoup

    Zut, je pensait avoir trouvé le 1% où le goto était approprié ...

    merci de vos réponse rapide, je pense que je vais utiliser un enum avec toutes mes fonctions (en pointeurs) et avancer en incrémentant l'indice, vous en pensez quoi ?
    Mais ca risque de prendre pas mal de place mémoire et beaucoup de temps d’appel de fonctions non ?

  6. #6
    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 4r19415 Voir le message
    bonjour
    donc dans ma fonction de mise_a_jour, j'envoie un message et je repart dans la boucle stabiliser mon drone

    mais, quand je reçois la réponse, il faut que je reprenne là ou je me suis arrêté dans mise_a_jour.... ça ressemble beaucoup à un GOTO !!!
    Ca ressemble surtout beaucoup à une coroutine. Ce n'est pas (encore) supporté directement par le langage, mais des implémentations à base de bibliothèques existent.
    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.

  7. #7
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    18 256
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 18 256
    Par défaut
    Ce post compètera les réponses :

    http://www.developpez.net/forums/d77.../goto-label-c/
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

  8. #8
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Tu peux aussi regarder du coté du pattern "état" ("state").
    C'est assez précisément ce que tu veux faire.

    Il y a plusieurs variantes d'implémentations

  9. #9
    Membre expérimenté Avatar de RPGamer
    Homme Profil pro
    Ingénieur en systèmes embarqués
    Inscrit en
    Mars 2010
    Messages
    168
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur en systèmes embarqués

    Informations forums :
    Inscription : Mars 2010
    Messages : 168
    Par défaut
    Comme le disais leternel, goto est historiquement lié au fait qu'il s'agit d'une traduction direct d'un "jump" en langage assembleur, en tout cas dans le concept. A l'origine, on pouvait encore beaucoup programmer en assembleur et cette façon de penser les programmes par des sauts directs ou des sauts conditionnels à une adresse (ou un label) était très répandue. Instaurer une instruction goto dans les langages haut niveau comme C ou BASIC était alors naturel.

    Les structures de langage qui ont été offertes par la suite on rendu cette manière de penser totalement caduc pour un programmeur "haut niveau". C'est du reste l'intérêt principal de ces langages, pouvoir remplacer des jump et des instructions logiques par des boucles for.

  10. #10
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2016
    Messages : 3
    Par défaut
    Meri de toutes vos réponses,
    je crois que j'ai assez d’élément pour m'en sortir maintenant, j'uploaderais la solution quand j'aurais quelque chose de propre

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Pourquoi "goto" est déconseillé ?
    Par Melchisedec dans le forum Débuter
    Réponses: 20
    Dernier message: 30/05/2020, 16h24
  2. Recordset seek : cas ou rien n'est trouvé
    Par Frog74 dans le forum VBA Access
    Réponses: 1
    Dernier message: 05/05/2008, 10h34
  3. ne recompiler que ce qui est nécessaire
    Par Lango dans le forum ANT
    Réponses: 1
    Dernier message: 12/10/2007, 18h02
  4. Traiter le cas ou ma date est nulle
    Par polianita dans le forum Access
    Réponses: 3
    Dernier message: 28/07/2006, 15h44
  5. Réponses: 3
    Dernier message: 19/06/2006, 14h25

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