See site in english Voir le site en francais
Website skin:
home  download  forum  link  contact

Welcome, Guest. Please login or register.
Did you miss your activation email?

Login with username, password and session length

Author Topic: [C++] Fonctions BOOL  (Read 3566 times)

0 Members and 1 Guest are viewing this topic.

Offline picto

  • Legend
  • ******
  • Posts: 5014
  • Country: France fr
  • Karma: 24
  • Criiii Crii Crii
22 September 2007, 15:10:50
Admettons que j'ai une action dans le genre qui appelle cette fonction bool.
La fonction peut me retourner true ou false.
Mais c'est là que je m'aperçois que je ne suis pas plus avancé :sick:
Je ne sais pas comment faire passer le RETURN dans la ligne suivante.

En clair, comment faire passer simplement le résultat TRUE ou FALSE
de GestionOuterDoor(int Dock) dans ???QUOI???  :sick:

Je sais très bien que j'aurais pu me passer d'une fonction BOOL dans ce cas
en faisant simplement un SetEtatBascule(id, PanelDockStatus[Dock].EVAPossible)
Mais c'est pour apprendre aussi ... Je ne comprend pas bien encore l'intérêt
d'une fonction bool puisque justement avec une simple fonction void et une variable
je peux arriver à un résultat.


   if(id ==AID_BOUTON_BASCULE+CREW_MANAGEMENT_CLOSE_OUTER_DOOR)
   {   
      if (my>22 && Bascule[id].Etat==TRUE)
      {
         GestionOuterDoor(iActiveDockNumber)
         SetEtatBascule(id, ???QUOI??? );
      }


bool Irridium::GestionOuterDoor(int Dock)
{
//Tambouille interne
   if (PanelDockStatus[Dock].EVAPossible==OUI)
   {
      return true;
   }
   else return false;
}



Message modifié ( 22-09-2007 15:13 )

Pic

Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15407
  • Karma: 256
  • Hein, quoi !?
    • FsPassengers
Reply #1 - 22 September 2007, 15:26:27
imbrique les fonctions:

SetEtatBascule(id,GestionOuterDoor(iActiveDockNumber));

C++ execute d'abord les fonctions "en parametre" puis substitue
la fonction par le resultat... il fait ca de droite a gauche...

exemple Si tu trace avec F11 (trace les fonctions) sur cette ligne:

SetEtatBascule(id,AutreFonction(),GestionOuterDoor(iActiveDockNumber));

Tu le verra d'abord executer GestionOuterDoor puis AutreFonction
et finalement SetEtatBascule avec en parametre les resultat des deux fonctions.

Dan



Message modifié ( 22-09-2007 15:26 )


Offline picto

  • Legend
  • ******
  • Posts: 5014
  • Country: France fr
  • Karma: 24
  • Criiii Crii Crii
Reply #2 - 22 September 2007, 15:46:06
C'était tout simple! Encore fallait il y penser.
De droite à gauche, ça veut dire aussi dans les boucles les plus imbriquées j'imagine.
C'est pas mal je trouve pour réduire le nombre de lignes.
Ca va finir par entrer dans le ciboulot à force ;)

Tiens, du coup, j'ai compris comment marche ta fonction qui retourne tous les case pour EVA de UMMU.
Mais au lieu de retourner true ou false je peux retourner
NO_ONE_ON_BOARD 0
EVA_POSSIBLE 1
PAS_POSSIBLE_TOUT_LE_MONDE_MORT 2
Etc ...

Merchi.



Message modifié ( 22-09-2007 15:59 )

Pic

Offline picto

  • Legend
  • ******
  • Posts: 5014
  • Country: France fr
  • Karma: 24
  • Criiii Crii Crii
Reply #3 - 22 September 2007, 17:04:52
C'est pratique dis donc ... ça deviens quand même bien lisible là ...

SetEtatPoussoir(CREW_MANAGEMENT_PERFORM_EVA,TestPossibiliteEva(iActiveDockNumber);

En tout cas, c'est moins chiant à lire que ça ...

               if(PanelDockStatus[iActiveDockNumber].EVAPossible==NON)
               {
                  SetEtatPoussoir(CREW_MANAGEMENT_PERFORM_EVA,Rouge);
               }
               else if(PanelDockStatus[iActiveDockNumber].EVAPossible==OUI)
               {
                  SetEtatPoussoir(CREW_MANAGEMENT_PERFORM_EVA,Blanc);
               }

Si tu vois d'autres choses pour rendre encore plus lisible, te gêne pas ! :badsmile:
Pourquoi Blanc et pourquoi pas Vert ? Pourquoi pas ! :badsmile:



Message modifié ( 22-09-2007 17:14 )

Pic

Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15407
  • Karma: 256
  • Hein, quoi !?
    • FsPassengers
Reply #4 - 22 September 2007, 17:20:11
Moi je ferais une fonction séparée qui remet tout les boutons comme
il faut en fonction du dock choisi... En plus il réaffiche l'image
du dock sélectionné etc etc...

SetDockPanelState(iDockNumber);

Dan


Offline picto

  • Legend
  • ******
  • Posts: 5014
  • Country: France fr
  • Karma: 24
  • Criiii Crii Crii
Reply #5 - 23 September 2007, 04:04:42
Bon ...
C'est la panne totale ...
Je croyais avoir compris pour les fonctions bool. :sad:
Là j'ai simplifié au maximum pour la lisibilité mais quand je fais cet appel
à la fonction depuis le mouse event il ne se passe absolument rien...
Alors que l'équivalent de ce que j'essaye de faire fonctionnait avant avec des else if ...

Code: [Select]
if(id ==AID_BOUTON_BASCULE+CREW_MANAGEMENT_CLOSE_INNER_DOOR)
{
if (my>22 && Bascule[id].Etat==TRUE)
{
SetEtatBascule(id,GestionInnerDoor(iActiveDockNumber));
return 1;
}
else if(my<22 && Bascule[id].Etat==FALSE)
{
SetEtatBascule(id,GestionInnerDoor(iActiveDockNumber));
}
return 1;
}

bool Irridium::GestionInnerDoor(int Dock)
{
if(PanelDockStatus[Dock].iInnerDoor==CLOSED)
{

return true;
}
else if(PanelDockStatus[Dock].iInnerDoor==OPEN)
{

return false;
}
}



Message modifié ( 23-09-2007 04:06 )

Pic

Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15407
  • Karma: 256
  • Hein, quoi !?
    • FsPassengers
Reply #6 - 23 September 2007, 04:48:41
id devait pas etre modifié avant d'etre passé aux Bascule[id]. ? :doubt:

genre:

Code: [Select]
int a=id-AID_BOUTON_BASCULE;
if (my>22 && Bascule[a].Etat==TRUE)

Dan



Message modifié ( 23-09-2007 04:49 )


Offline picto

  • Legend
  • ******
  • Posts: 5014
  • Country: France fr
  • Karma: 24
  • Criiii Crii Crii
Reply #7 - 23 September 2007, 04:54:46

Ah si !!!
Mais quel c... :wall:
J'ai tellement le nez dans le guidon que je ne regarde plus ou il faut ... :wall
Je focalise sur un truc et je n'en démord plus !!!

Je ferais mieux de prendre des vacances comme le suggérait Sirius.
Merci Dan, et bravo pour le coup d'oeil ;)


Pic

Offline picto

  • Legend
  • ******
  • Posts: 5014
  • Country: France fr
  • Karma: 24
  • Criiii Crii Crii
Reply #8 - 25 September 2007, 02:05:20
Bon, ben c'est reparti pour les questions stupides ... mais je suis un peu embêté.
Je me suis servi d'une fonction BOOL pour retourner VRAI ou FAUX dans l'état d'un bouton.
Je cherche à tester en même temps la position de deux autres switchs ... OK ça fonctionne.

Mais, c'est peut être un mauvais choix car je ne veux rien retourner sur le troisième chemin de contrôle.
Et du coup j'ai un avertissement à la compile ...


bool Irridium::GestionPressureChamber(int Dock)
{
   if(Patati)
   {
      return FALSE;
   }
   if(Patata)
   {
      return TRUE;
   }
}


« Last Edit: 25 September 2007, 03:30:07 by picto »
Pic

Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15407
  • Karma: 256
  • Hein, quoi !?
    • FsPassengers
Reply #9 - 25 September 2007, 02:20:50
tu peux pas rien retourner, c'est justement le but de la fonction...
t'imagine la gueule du code qu'attend le resultat "rien ? ah bon ! CTD!!!!!"

quel est le cas ou "elle ne devrait rien retourner" ?

Dan

« Last Edit: 25 September 2007, 03:30:07 by DanSteph »

Offline picto

  • Legend
  • ******
  • Posts: 5014
  • Country: France fr
  • Karma: 24
  • Criiii Crii Crii
Reply #10 - 25 September 2007, 02:24:31
Ben vi je sais ...

Le troisième cas, c'était si première condition pas vérifiée et si deuxième condition pas vérifiée non plus ...
Ben je fais quoi ? il me disait le compilateur ... vu l'écriture précédente ...

Mais en fait, j'ai trouvé ... :sick:

bool Irridium::GestionPressureChamber(int Dock)
{
if(Patati)
return FALSE;
else return TRUE;

if(Patata)
return TRUE;
else return FALSE;
}

Et là, ça contrôle tout et j'ai plus d'avertissement.



Message modifié ( 25-09-2007 02:34 )

« Last Edit: 25 September 2007, 03:30:07 by picto »
Pic

Offline picto

  • Legend
  • ******
  • Posts: 5014
  • Country: France fr
  • Karma: 24
  • Criiii Crii Crii
Reply #11 - 25 September 2007, 02:44:08
Mais non :wall:
Ca marche pas  avec ça juste au dessus ... :wall:
J'ai vraiment trois trucs possibles ...
J'ai rien compris sur comment utiliser judicieusement une fonction BOOL :doubt:



Message modifié ( 25-09-2007 02:47 )

« Last Edit: 25 September 2007, 03:30:07 by picto »
Pic

Offline picto

  • Legend
  • ******
  • Posts: 5014
  • Country: France fr
  • Karma: 24
  • Criiii Crii Crii
Reply #12 - 25 September 2007, 02:53:17
Ca ça fonctionne ...
La fonction BOOL est appelée depuis un mouse event ...
Mais le compilateur aime pas ... avertissement.
Et TRUE ou FALSE servent à rafraichir l'etat du bouton.

Code: [Select]
bool Irridium::GestionPressureChamber(int Dock)
{
if(PanelDockStatus[Dock].iOuterDoor==CLOSED && PanelDockStatus[Dock].iInnerDoor==CLOSED)
{
if(Bascule[CREW_MANAGEMENT_DEPRESSURIZE_CHAMBER].Etat==TRUE)
{
PanelDockStatus[Dock].iChamber=FALSE;
RevertRemplissageChambre (Dock);
return FALSE;
}
else if(Bascule[CREW_MANAGEMENT_DEPRESSURIZE_CHAMBER].Etat==FALSE)
{
PanelDockStatus[Dock].iChamber=TRUE;
RevertRemplissageChambre (Dock);
return TRUE;
}
}
}



Message modifié ( 25-09-2007 02:56 )

« Last Edit: 25 September 2007, 03:30:07 by picto »
Pic

Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15407
  • Karma: 256
  • Hein, quoi !?
    • FsPassengers
Reply #13 - 25 September 2007, 02:56:41
Chaque chemin doit retourner une valeur... dans le cas ou la condition est fausse la fonction ne retourne rien= pas de
compile il faut mettre un return à la fin au cas ou le if ne serait pas executé.


Code: [Select]
bool Irridium::GestionPressureChamber(int Dock)
{
if(PanelDockStatus[Dock].iOuterDoor==CLOSED && PanelDockStatus[Dock].iInnerDoor==CLOSED)
{
if(Bascule[CREW_MANAGEMENT_DEPRESSURIZE_CHAMBER].Etat==TRUE)
{
PanelDockStatus[Dock].iChamber=FALSE;
RevertRemplissageChambre (Dock);
return FALSE;
}
else if(Bascule[CREW_MANAGEMENT_DEPRESSURIZE_CHAMBER].Etat==FALSE)
{
PanelDockStatus[Dock].iChamber=TRUE;
RevertRemplissageChambre (Dock);
return TRUE;
}
}
          return FALSE;
}



Message modifié ( 25-09-2007 02:56 )

« Last Edit: 25 September 2007, 03:30:07 by DanSteph »

Offline picto

  • Legend
  • ******
  • Posts: 5014
  • Country: France fr
  • Karma: 24
  • Criiii Crii Crii
Reply #14 - 25 September 2007, 03:11:59


Ca me parait bizarre comme raisonnement ...
Admettons que Bascule[CREW_MANAGEMENT_DEPRESSURIZE_CHAMBER].Etat==TRUE
Mais que PanelDockStatus[Dock].iOuterDoor==OPEN
La fonction va me retourner FALSE ... alors que je ne veux pas dans ce cas ...
Je veux que la bascule reste à TRUE ...


« Last Edit: 25 September 2007, 03:30:07 by picto »
Pic

Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15407
  • Karma: 256
  • Hein, quoi !?
    • FsPassengers
Reply #15 - 25 September 2007, 03:21:11
serait ce que ta fonction ne sait pas quoi répondre à un moment donné ? :doubt:

Ce serait très bizarre ca, le C++ n fait pas de la divination et le code ne PEUT
pas répondre "euh ben.. je sais pas!"

Si ca:

Admettons que Bascule[CREW_MANAGEMENT_DEPRESSURIZE_CHAMBER].Etat==TRUE
Mais que PanelDockStatus[Dock].iOuterDoor==OPEN

C'est le seul cas "non prevu" (donc la derniere ligne est executée) change la simplement
pour "return TRUE"

Tu DOIS prevoir tout les cas... et la fonction doit obligatoirement avoir un return
m'eme si TOI tu sais que cette ligne ne sera JAMAIs executée...

donc , deux methodes (pseudo code):

//**********************************************
// traite juste les cas TRUE et sinon return false par defaut:
//**********************************************
Code: [Select]
BOOL Robert_Prend_T_il_Un_BAIN?()
{
      if(RobertBain==TRUE)
      {
             return TRUE; // robert prend un bain
      }
      return FALSE;  // ben non, si on est la il prend pas de bain, return FALSE.
}


//**********************************************
// traite tout les cas, on s'en fout du return par defaut il est JAMAIs executé (sauf ERREUR)
//**********************************************
Code: [Select]
BOOL Robert_Prend_T_il_Un_BAIN?()
{
      if(RobertBain==TRUE)
      {
             return TRUE; // robert prend un bain
      }
      if(RobertBain==FALSE)
      {
             return FALSE; // robert prend pas de bain
      }

      return FALSE;  // cette ligne ne sera JAMAIS executée on s'en fout mais le C++ ne peut pas le deviner il VEUT que  
                             // ta fonction return quelque chose dans TOUT les cas possible... (deux if pas executé pasque le  
                             // codeur a fait une "neuneuterie")
}

C'est clair ?

Dan



Message modifié ( 25-09-2007 03:24 )

« Last Edit: 25 September 2007, 03:30:07 by DanSteph »

Offline picto

  • Legend
  • ******
  • Posts: 5014
  • Country: France fr
  • Karma: 24
  • Criiii Crii Crii
Reply #16 - 25 September 2007, 03:30:07
Vi ... c'est ce que j'étais en train de faire ...
Désolé pour le long message que tu as dû poster ... :sick:


Code: [Select]
bool Irridium::GestionPressureChamber(int Dock)
{
if(PanelDockStatus[Dock].iOuterDoor==CLOSED && PanelDockStatus[Dock].iInnerDoor==CLOSED)// Si les
deux portes sont fermées
{
if(Bascule[CREW_MANAGEMENT_DEPRESSURIZE_CHAMBER].Etat==TRUE)
{
PanelDockStatus[Dock].iChamber=FALSE;
RevertRemplissageChambre (Dock);
SetEtatDisplay(GRAND_DISPLAY,AffichageDock+Dock);
ChargeEtJoue("Soufflerie.wav");
return FALSE;
}
else if(Bascule[CREW_MANAGEMENT_DEPRESSURIZE_CHAMBER].Etat==FALSE)
{
PanelDockStatus[Dock].iChamber=TRUE;
RevertRemplissageChambre (Dock);
SetEtatDisplay(GRAND_DISPLAY,AffichageDock+Dock);
ChargeEtJoue("Soufflerie.wav");
return TRUE;
}
}
else if(PanelDockStatus[Dock].iOuterDoor!=CLOSED || PanelDockStatus[Dock].iInnerDoor!=CLOSED)
{
if(Bascule[CREW_MANAGEMENT_DEPRESSURIZE_CHAMBER].Etat==TRUE)
{
ChargeEtJoue("warningnotice.wav");
return TRUE;
}
else if(Bascule[CREW_MANAGEMENT_DEPRESSURIZE_CHAMBER].Etat==FALSE)
{
ChargeEtJoue("warningnotice.wav");
return FALSE;
}
}
       return FALSE;
}



Message modifié ( 25-09-2007 03:32 )

« Last Edit: 25 September 2007, 03:30:07 by picto »
Pic