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 :

Petit problème de logique...


Sujet :

C++

  1. #1
    Membre du Club
    Inscrit en
    Septembre 2005
    Messages
    139
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 139
    Points : 55
    Points
    55
    Par défaut Petit problème de logique...
    Dans mon programme, cette 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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    bool Sprite_Menu::OnClick(int numSprite, int xsouris, int ysouris, int click)
    {
        if (xsouris > rect[numSprite].x && xsouris < rect[numSprite].x+rect[numSprite].w && ysouris > rect[numSprite].y && ysouris <  rect[numSprite].y+rect[numSprite].h)
        {
          if (click == 1)
          {
             if(Souris_T != 0)
             {
                Uint32 Dif = SDL_GetTicks() - Souris_T;
                if( Dif > Temp_MIN )
                if( Dif < Temp_MAX )
                {
                return true;
                }
                else
                {
                Souris_T = 0;
                return false;
                }
             }
           else
           {
           Souris_T = SDL_GetTicks();
           return false;
           }
          }
          else return false;
        }
        else return false;
    }
    retourne toujours true quand je clique, meme si je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
                if( Dif > Temp_MIN )
                if( Dif < Temp_MAX )
                {
                return false;
                }
    D'ou peut venir la cause ?

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    186
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 186
    Points : 304
    Points
    304
    Par défaut
    Salut,

    ma réponse est totalement hypothétique mais bon. Je crois me souvenir que lorsque tu clique, il y a en fait un clic quand tu appuie mais aussi quand tu relache le bouton. Peut etre cela vient il de ca.

    Cordialement.

  3. #3
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Moi ce qui me choque c'est que si tu fais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if( Dif > Temp_MIN )
                if( Dif < Temp_MAX )
                {
                return false;
                }
    alors il n'y a plus aucun "return true" dans ta fonction, il est donc impossible qu'elle te renvoie true.

    Le mieux est encore de faire une execution pas à pas pour voir par où passe ton code, et pourquoi il ne te renvoie pas ce que tu veux.

  4. #4
    Membre du Club
    Inscrit en
    Septembre 2005
    Messages
    139
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 139
    Points : 55
    Points
    55
    Par défaut
    Il me semble que quand une fonction ne peut rien retourner, elle retourne true ou 1 (en fonction que ce soit un int ou un bool)... Peut être que ça viendrait de là.

    @Loulou24 Pourtant, elle retourne true, c'est bien ce qui pose problème...

    EDIT : Quand je laisse le clic appuyé, la fonction retourne true, avant que je relache le bouton.

  5. #5
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    On pourrait voir dans quel contexte elle est appelée? (je sens un truc louche, dans le genre c'est-même-pas-cette-fonction-là-qui-est-appelée où une mauvaise mémorisation du résultat...)
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  6. #6
    Membre du Club
    Inscrit en
    Septembre 2005
    Messages
    139
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 139
    Points : 55
    Points
    55
    Par défaut
    Voila, dans le contexte :

    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
            switch (menu.mode)
                     {
                     case 0:
                     menu.Destination(0, 310, 200, true);
                     menu.Destination(1, 250, 300, true);
                     menu.OnMouse(0, xsouris, ysouris, boutons[0]);
                     menu.OnMouse(1, xsouris, ysouris, boutons[0]);
                if (menu.OnClick(0, xsouris, ysouris, boutons[0]) == true) menu.mode = 1;/////////////LA VOILA//////////////
                     menu.affich(screen, 0);
                     menu.affich(screen, 1);
                     break;
                     case 1:
                     menu.Destination(0, 310, 200, true);
                     menu.Destination(2, 280, 250, false);
                     menu.Destination(3, 320, 300, false);
                     menu.OnMouse(0, xsouris, ysouris, boutons[0]);
                     menu.OnMouse(2, xsouris, ysouris, boutons[0]);
                     menu.OnMouse(3, xsouris, ysouris, boutons[0]);
                     menu.affich(screen, 0);
                     menu.affich(screen, 2);
                     menu.affich(screen, 3);
                     break;
    Ce code est dans un boucle while(1).

    EDIT : Si je définit
    #define Temp_MIN 40000
    #define Temp_MAX 40000

    il suffit d'un clic de meme pas une seconde pour que ça le fasse...

  7. #7
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Il me semble que quand une fonction ne peut rien retourner, elle retourne true ou 1 (en fonction que ce soit un int ou un bool)... Peut être que ça viendrait de là.
    Qu'est-ce que tu entends par "quand une fonction ne peut rien retourner" ? Une fonction non void doit toujours retourner quelque chose, si tu oublies un return dans tous tes if le compilo ne le laissera pas passer.

    Mais comme je te l'ai dit, avec une execution pas à pas tu verrais tout de suite ce qui cloche...

  8. #8
    Membre du Club
    Inscrit en
    Septembre 2005
    Messages
    139
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 139
    Points : 55
    Points
    55
    Par défaut
    J'ai essayé, je n'arrive pas à comprendre le fonctionnement du pas à pas (sous devc++)

  9. #9
    Membre du Club
    Inscrit en
    Septembre 2005
    Messages
    139
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 139
    Points : 55
    Points
    55
    Par défaut
    Ah si, c'est bon, j'ai réussi. Mais je ne comprend plus rien... Ca retourne bien false pourtant...

  10. #10
    Membre du Club
    Inscrit en
    Septembre 2005
    Messages
    139
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 139
    Points : 55
    Points
    55
    Par défaut
    Excusez moi pour le triple post...

    Mais est-ce qu'il existe un moyen pour quitter une fonction en cours ?

  11. #11
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Excusez moi pour le triple post...
    Tu peux éditer tes posts, au lieu d'en ajouter

    Mais est-ce qu'il existe un moyen pour quitter une fonction en cours ?
    Ben... Un return ?

  12. #12
    Membre du Club
    Inscrit en
    Septembre 2005
    Messages
    139
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 139
    Points : 55
    Points
    55
    Par défaut
    Mmmmh... C'est bien ce qu'il em semblait, il n'y a pas d'autre moyens...

    Bon, il va falloirt que je cherche une autre solution...

  13. #13
    Membre du Club
    Inscrit en
    Septembre 2005
    Messages
    139
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 139
    Points : 55
    Points
    55
    Par défaut
    Ca y est !! J'ai finalement régler le problème en enlevant le dernier else, en laissant seulement return false. Ca ne me dit pas pourquoi ça buggait avant, mais au moins ça marche.

  14. #14
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    J'ai trouvé!
    Quand ce test:
    Uint32 Dif = SDL_GetTicks() - Souris_T;
    if( Dif > Temp_MIN )
    if( Dif < Temp_MAX )
    était faux, le programme ne passait par aucun return (c'était peut-être un peu complexe pour que le compilo signale que "not all control paths return a value"....)
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  15. #15
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Il me semble que tu avais oublié un return (bizarre que le compilo n'ait rien dit...) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    if( Dif > Temp_MIN )
                if( Dif < Temp_MAX )
                {
                return true;
                }
                else
                {
                Souris_T = 0;
                return false;
                }
    Tu as deux if mais le premier n'a pas sa clause else. Donc, si Dif >= Temp_MIN, il n'y a aucun return, et apparamment le compilo ne dit rien et renvoie quelque chose d'assimilable à true.

    Tu peux simplement faire ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    if( Dif > Temp_MIN && Dif < Temp_MAX )
                {
                return true;
                }
                else
                {
                Souris_T = 0;
                return false;
                }
    Ou encore, comme c'est parfois conseillé, utiliser la règle dont je ne sais plus le nom, qui dit "un point d'entrée, un point de sortie". Ca donnerait quelque chose comme ça :

    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
    bool Sprite_Menu::OnClick(int numSprite, int xsouris, int ysouris, int click)
    {
        // Un point d'entrée
        bool Ret = false;
     
        if (xsouris > rect[numSprite].x && xsouris < rect[numSprite].x+rect[numSprite].w && ysouris > rect[numSprite].y && ysouris <  rect[numSprite].y+rect[numSprite].h)
        {
          if (click == 1)
          {
             if(Souris_T != 0)
             {
                Uint32 Dif = SDL_GetTicks() - Souris_T;
                if( Dif > Temp_MIN )
                if( Dif < Temp_MAX )
                {
                    Ret = true;
                }
                else
                {
                    Souris_T = 0;
                }
             }
           else
           {
               Souris_T = SDL_GetTicks();
           }
          }
        }
     
        // Un point de sortie
        return Ret;
    }
    Comme ça tu es sûr de renvoyer quelque chose.

  16. #16
    Membre du Club
    Inscrit en
    Septembre 2005
    Messages
    139
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 139
    Points : 55
    Points
    55
    Par défaut
    Oui, c'est sur. Je vais arranger mon code un petit peu.

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

Discussions similaires

  1. Modélisation d'un petit problème logique avec Prolog
    Par blackmisery dans le forum Prolog
    Réponses: 36
    Dernier message: 01/10/2012, 18h03
  2. Petit problème de logique à résoudre
    Par Ggamer dans le forum Général Python
    Réponses: 9
    Dernier message: 07/01/2010, 09h20
  3. Petit problème de logique
    Par deborah95 dans le forum Langage
    Réponses: 7
    Dernier message: 25/09/2009, 09h37
  4. petit problème premier plan, arrière plan
    Par gros bob dans le forum OpenGL
    Réponses: 4
    Dernier message: 19/04/2004, 12h00
  5. [jointure] Petit problème sur le type de jointure...
    Par SteelBox dans le forum Langage SQL
    Réponses: 13
    Dernier message: 13/02/2004, 18h55

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