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 :

control reaches end of no-void function


Sujet :

C++

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    2 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 2 051
    Points : 877
    Points
    877
    Par défaut control reaches end of no-void function
    Bonjour tous,
    il y a un warning que je ne comprends pas:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    control reaches end of no-void function
    voici mon code:

    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
    double AAA::get_Temperature(double maVariable)
    {
        if ((maVariable<BBB[0])||(maVariable>BBB[BBB.size()-1]))
        {                                                 
            cout << "Error: BBB " << maVariable << " out of range!" << endl;
            return -1;
        }
        else
        {
            for (unsigned int i=0;i<BBB.size();i++) 
            {
                if (maVariable==BBB[i])
                {
                    return AAA[i];
                }
            }
            for (unsigned int i=0;i<BBB.size()-1;i++) 
            {
                if ((maVariable>BBB[i])&&(maVariable<BBB[i+1]))
                {
                    return AAA;
                }
            }
    	}
    }
    je pense que le warning vient du fait qu'il y a plusieurs return mais mon code fonctionne très bien comme cela, quel type d'erreur cela pourrais m'engendrer ? es ce grave docteur?

  2. #2
    Expert confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Points : 4 551
    Points
    4 551
    Par défaut
    Il manque un return à la fin ; si aucun des return n'est rencontré avant (parce que les tests échouent) alors la fonction va renvoyer n'importe quoi.
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

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

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 612
    Points : 30 611
    Points
    30 611
    Par défaut
    Salut,
    Citation Envoyé par 21did21 Voir le message
    je pense que le warning vient du fait qu'il y a plusieurs return mais mon code fonctionne très bien comme cela, quel type d'erreur cela pourrais m'engendrer ? es ce grave docteur?
    Ce n'est pas parce qu'il y a plusieurs return dans ton code que cet avertissement apparait, mais bien parce qu'il en manque un à un endroit auquel le compilateur s'attend à en rencontrer un.

    Le compilateur s'étonne de ne pas rencontrer de return avant l'accolade fermante de la fonction qui est sensée renvoyer quelque chose.

    En effet, il existe un principe fortement remis en cause nommé SESE (Single Entry, Single Exit), qui considère que toute fonction ne devrait présenter qu'un seul point d'entrée (ce dont tout le monde est d'accord) et une seule sortie, et donc, un seul "return" qui se trouve... à la fin de la fonction.

    Le compilateur émet donc cet avertissement sans même avoir vérifié la présence d'un retrun dans les différents chemins possibles.

    Il a, d'ailleurs, raison de le faire car il est très difficile de s'assurer du fait que, en passant dans la partie "faux" de ton code, tu te trouvera effectivement dans une situation dans laquelle une des deux boucle provoquera le renvoi de quelque chose.

    Nous nous retrouverions alors face à un comportement indéterminé: quelle sera dans ce cas la valeur utilisée par la fonction appelante vu que la fonction ne renvoie rien
    Le meilleur moyen pour éviter ce genre d'avertissement est de faire en sorte que le "gros de la logique" (la partie qui renvoie une valeur que l'on peut évaluer comme étant valide) s'effectue dans la partie "vrai" du test, ce qui permet d'obtenir quelque chose proche de
    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
    if (/* test donnant vrai si on doit effectuer le gros du code */ )
    {
        /* logique implacable renvoyant une valeur valide si elle est trouvée */
        if(truc)
            return blabla;
    }
    /* si on arrive ici, il y a deux solutions :
     *    - soit on a déterminé (grace au test) que l'on ne trouverait pas la valeur
     *      valide
     *    - soit on a effectué la logique implacable, mais on n'a malgré tout pas
     *      trouvé la valeur adéquate à renvoyer
     *
     * nous renvoyons donc une valeur identifiée comme invalide quoi qu'il 
     * advienne
     */
    return -1;
    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

  4. #4
    Membre actif

    Profil pro
    Inscrit en
    Avril 2010
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 356
    Points : 206
    Points
    206
    Par défaut
    Et si jamais tu fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    double f()
    {
      if(condition)
      return ...
      else
      return ...
    }
    Le compilateur affichera ce warning quand même. Tu peux soit mettre un return qui ne servira à rien, soit l'ignorer.

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    2 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 2 051
    Points : 877
    Points
    877
    Par défaut
    merci beaucoup tout les 2 pour toutes ces precisions!

    Citation Envoyé par NoIdea Voir le message
    Et si jamais tu fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    double f()
    {
      if(condition)
      return ...
      else
      return ...
    }
    Le compilateur affichera ce warning quand même. Tu peux soit mettre un return qui ne servira à rien, soit l'ignorer.
    vous voulez donc dire tout les 2 que je dois faire cela:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    double f()
    {
      if(condition)
    {
      return 1;
    }
      else
    {
      return 2;
    }
    return=0;
    }
    en faisant cela suis je sur qu'il va renvoyer 1 ou 2 et pas 0?
    si j'ai bien compris: oui, car dès que la fonction trouve un premier return elle s'arrete automatiquement? et donc le return 0 ne sera jamais "vu" par la fonction (ca sert juste à lui "faire plaisir" ) ?

  6. #6
    Membre actif

    Profil pro
    Inscrit en
    Avril 2010
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 356
    Points : 206
    Points
    206
    Par défaut
    Exactement

  7. #7
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Citation Envoyé par koala01 Voir le message
    Le compilateur émet donc cet avertissement sans même avoir vérifié la présence d'un retrun dans les différents chemins possibles.
    Non, certains compilateurs, g++ par exemple (mais ce n'est probablement pas le seul) essaie bien d'analyser les différents chemins, au moins jusqu'à un certain point (et surtout en ne prenant en compte que la fonction, pas d'éventuelles contraintes externe).
    Et affichent ce type de warning si effectivement il y a un chemin qui ne rencontre pas de return ou lorsque la fonction devient suffisamment complexe pour que l'analyse n'aboutisse pas au résultat correct.

    Citation Envoyé par NoIdea Voir le message
    Et si jamais tu fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    double f()
    {
      if(condition)
      return ...
      else
      return ...
    }
    Le compilateur affichera ce warning quand même. Tu peux soit mettre un return qui ne servira à rien, soit l'ignorer.
    Il est fort probable que dans un cas aussi simple le compilateur n'affiche pas se warning (je viens de faire le test avec g++ et effectivement je n'ai pas de warning dans cette configuration).


    Dans le cas du PO, il me semble qu'effectivement il n'y ait pas de return dans certains cas. Par exemple lorsque BBB.size vaut 0 (la fonction est d'ailleurs incorrecte dans ce cas), ce qui est probablement pris en compte en amont.

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    2 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 2 051
    Points : 877
    Points
    877
    Par défaut
    merci tous pour votre aide, ce forum est vraiment super

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

Discussions similaires

  1. void function() et void function(void)
    Par Kel-T dans le forum C
    Réponses: 3
    Dernier message: 10/06/2012, 13h34
  2. warning: control reaches end of non-void function
    Par loisir1976 dans le forum Débuter
    Réponses: 4
    Dernier message: 22/09/2009, 11h54
  3. Type "groupe de controles" dans une function
    Par méphistopheles dans le forum VB 6 et antérieur
    Réponses: 15
    Dernier message: 20/06/2008, 22h07
  4. Réponses: 12
    Dernier message: 01/06/2006, 16h32
  5. [VBA-E]bloquage sur end function
    Par ogenki dans le forum Macros et VBA Excel
    Réponses: 27
    Dernier message: 23/02/2006, 19h50

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