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++

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Membre �prouv�
    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
    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
    Membre Expert

    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 49
    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
    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
    Membre �clair�

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

    Informations forums :
    Inscription : Avril 2010
    Messages : 356
    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.

  4. #4
    Membre �prouv�
    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
    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" ) ?

  5. #5
    Membre �clair�

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

    Informations forums :
    Inscription : Avril 2010
    Messages : 356
    Par d�faut
    Exactement

  6. #6
    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 : 46
    Localisation : France, Is�re (Rh�ne Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    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.

  7. #7
    Membre �prouv�
    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
    Par d�faut
    merci tous pour votre aide, ce forum est vraiment super

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

+ 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, 12h34
  2. warning: control reaches end of non-void function
    Par loisir1976 dans le forum D�buter
    R�ponses: 4
    Dernier message: 22/09/2009, 10h54
  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, 21h07
  4. R�ponses: 12
    Dernier message: 01/06/2006, 15h32
  5. [VBA-E]bloquage sur end function
    Par ogenki dans le forum Macros et VBA Excel
    R�ponses: 27
    Dernier message: 23/02/2006, 18h50

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