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 :

Warning C4715 : les chemins de controle ne retournent pas tous une valeur


Sujet :

C++

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    octobre 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : octobre 2010
    Messages : 9
    Points : 3
    Points
    3
    Par défaut Warning C4715 : les chemins de controle ne retournent pas tous une valeur
    Bonsoir,

    J'ai un petit souci avec l'une de mes fonctions. Dès que je compile sous Visio, j'obtiens ce warning. Je n'arrive pas à comprendre où est le problème. Je suis coincée et je n'arrive pas à avancer. Si quelqu'un aurait l'amabilité de m'aider svp ce serait gentil.

    Merci d'avance.

    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
    int Booking::Reserve(RoomReservation*reserv)
    {
     
    	int n = reserv->getArrival()->getDay();
    	int k = reserv->getNB_nights();
     
    	for(int i=0; i<N; i++)
    	{
    		for(int j = n; j<=((30 *(n-1)-1) + k); j++)
    		{
    			if(rooms[i][j]==0)
     
    			{
    				rooms[i][j] = reserv->getNB_reservation();
     
    				ReservationRequest = reserv;
     
    				return ReservationRequest->getNB_room();
    			}
     
    		else 
    			return 0;
     
    		}
    	}
    }

  2. #2
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : mai 2007
    Messages : 11 517
    Points : 50 364
    Points
    50 364
    Par défaut
    Citation Envoyé par BB008 Voir le message
    Dès que je compile sous Visio,
    Ce ne serait pas Visual Studio plutôt ? Visio est un logiciel de dessin

    Citation Envoyé par BB008 Voir le message
    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
    int Booking::Reserve(RoomReservation*reserv)
    {
     
    	int n = reserv->getArrival()->getDay();
    	int k = reserv->getNB_nights();
     
    	for(int i=0; i<N; i++)
    	{
    		for(int j = n; j<=((30 *(n-1)-1) + k); j++)
    		{
    			if(rooms[i][j]==0)
     
    			{
    				rooms[i][j] = reserv->getNB_reservation();
     
    				ReservationRequest = reserv;
     
    				return ReservationRequest->getNB_room();
    			}
     
    		else 
    			return 0;
     
    		}
    	}
    }
    Ton else n'est pas terriblement aligné, il devrait être aligné sur le if. Ceci dit, c'est déjà bien, il y a in minimum d'indentation.

    Visiblement, tu as une variable globale qui s'appelle N (très mal nommée d'ailleurs). Il est possible que la boucle globale ne soit jamais parcourue si N est négatif et donc effectivement, que tu quittes ta fonction avec une valeur aléatoire ce qui te provoque ton warning.
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    octobre 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : octobre 2010
    Messages : 9
    Points : 3
    Points
    3
    Par défaut
    Oui je suis un peu étourdie : Visual Studio effectivement.
    Mais j'ai fait un #define N 10 dans mon .h.
    Je ne vois comment N peut-être négatif.
    Merci pour votre réponse et merci de m'avoir accordée un peu de votre temps.


    Citation Envoyé par ram-0000 Voir le message
    Ce ne serait pas Visual Studio plutôt ? Visio est un logiciel de dessin


    Ton else n'est pas terriblement aligné, il devrait être aligné sur le if. Ceci dit, c'est déjà bien, il y a in minimum d'indentation.

    Visiblement, tu as une variable globale qui s'appelle N (très mal nommée d'ailleurs). Il est possible que la boucle globale ne soit jamais parcourue si N est négatif et donc effectivement, que tu quittes ta fonction avec une valeur aléatoire ce qui te provoque ton warning.

  4. #4
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : mai 2007
    Messages : 11 517
    Points : 50 364
    Points
    50 364
    Par défaut
    Un compilateur n'est pas omniscient. Il arrive à analyser un code mais lorsqu'il devient complexe (2 boucles for imbriquées), il peut avoir des faiblesses.

    D'ailleurs en regardant ton code (et en le simplifiant un peu), je le trouve un peu bizarre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    for(int i=0; i<N; i++)
    {
    	for(int j = n; j<=((30 *(n-1)-1) + k); j++)
    	{
    		if(condition == 0)
    			return quelque chose
    		else
    			return autre chose
    	}
    }
    Tes 2 boucles for ne sont parcourues qu'une seule fois car condition est soit vrai soit fausse donc la fonction est quittée immédiatement sans plus parcourir tes boucles, bizarre !!
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    octobre 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : octobre 2010
    Messages : 9
    Points : 3
    Points
    3
    Par défaut
    Oui je comprends ce que vous voulez dire. Je voulais traduire en code ces phrases : "La fonction Reserve reçoit en paramètre un pointeur sur de réservation. La fonction recherche les chambres disponibles à la période. Si une chambre est disponible, le numéro de réservation sera stocké à l'élément du tableau correspondant à ce numéro de chambre. Si la réservation est acceptée la fonction doit stocker l'objet de réservation dans ReservationRequest. La fonction doit retourner le numéro de chambre réservée ou 0 si la réservation est infructueuse."

    Étant débutante en C++, j'ai essayé de traduire de cette manière. Donc si j'ai bien compris je dois modifier mon if.

  6. #6
    Membre éprouvé Avatar de Steph_ng8
    Homme Profil pro
    Doctorant en Informatique
    Inscrit en
    septembre 2010
    Messages
    677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Informatique

    Informations forums :
    Inscription : septembre 2010
    Messages : 677
    Points : 997
    Points
    997
    Par défaut
    Bonsoir.

    Citation Envoyé par BB008 Voir le message
    Donc si j'ai bien compris je dois modifier mon if.
    Je dirais que ton if ne devrait pas avoir de else.

    Si j'ai bien compris, tu veux parcourir le tableau tant qu'une condition est fausse.
    Autrement dit, si la condition est vraie, tu t'arrêtes ; sinon, tu continues le parcours.
    Donc, pour résumer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    si <condition_vraie>
      alors
        <action>
        stop
      sinon
         <rien>
    fin si

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    octobre 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : octobre 2010
    Messages : 9
    Points : 3
    Points
    3
    Par défaut
    Bonsoir,

    Merci pour votre réponse.
    Le problème est que je dois absolument retourner deux valeurs : une valeur si la condition est vraie, sinon 0 dans le cas contraire.

  8. #8
    Membre éprouvé Avatar de Steph_ng8
    Homme Profil pro
    Doctorant en Informatique
    Inscrit en
    septembre 2010
    Messages
    677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Informatique

    Informations forums :
    Inscription : septembre 2010
    Messages : 677
    Points : 997
    Points
    997
    Par défaut
    Tu ne dois retourner 0 que si tu as parcouru tout ton tableau et que tu n'as pas pu faire la réservation.
    Ce qui arrive lorsque les deux deux boucles for (enfin surtout la première, en fait) sont terminées, et que la condition n'a jamais été vraie.

    Autrement dit, l'instruction return 0; ne doit pas apparaître à l'intérieur des boucles, mais après.
    Ainsi, ça correspondra à ce que tu veux :
    • si, durant le parcours, la condition est vraie, alors on enregistre et on s'arrête ;
    • sinon, c'est que le parcours est terminé et que la condition n'a jamais été vraie ; alors on renvoie l'information comme quoi on n'a pas pu enregistrer la réservation.

  9. #9
    Candidat au Club
    Profil pro
    Inscrit en
    octobre 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : octobre 2010
    Messages : 9
    Points : 3
    Points
    3
    Par défaut
    Merci beaucoup pour votre explication. Je n'ai plus de warning. Je n'avais pas compris le problème des for. Encore merci de m'avoir éclairée.

  10. #10
    Membre émérite
    Profil pro
    Inscrit en
    novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : novembre 2004
    Messages : 2 764
    Points : 2 661
    Points
    2 661
    Par défaut
    Citation Envoyé par BB008 Voir le message
    Mais j'ai fait un #define N 10 dans mon .h.
    Essaye de perdre l'habitude d'utiliser des .
    Utilise plutôt in

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 16/04/2020, 17h57
  2. Chemins de code de retournant pas forcément une valeur
    Par Tanoak_LaCapuche dans le forum C#
    Réponses: 3
    Dernier message: 12/07/2012, 15h44
  3. WebPart - Tous les chemins ne retournent pas nécessairement une valeur
    Par Spitfire378 dans le forum Développement Sharepoint
    Réponses: 2
    Dernier message: 25/05/2011, 08h41
  4. Réponses: 2
    Dernier message: 05/07/2009, 16h46
  5. Fonction ne retournant pas toujours une valeur
    Par mastochard dans le forum C
    Réponses: 14
    Dernier message: 25/05/2006, 12h13

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