VS 2005: différence de compilation debug/relase?

VS 2005: différence de compilation debug/relase? - C++ - Programmation

Marsh Posté le 20-10-2006 à 11:31:28    

Hello world,
 
Bon, OK j'ai oublié le parenthésage sur ce coup, mais surtout je suis tombé sur un truc louche!

Code :
  1. if(ASystem::GetButtonsState() & kBtnRight|kBtnLeft)


 
En cherchant pourquoi ca ne passait pas bien en release, il semblerait bien que Visual Studio C++ Pro 2005 évalue l'expression différemment selon le mode (debug/release)!

Code :
  1. ( (ASystem::GetButtonsState()&kBtnRight)  |  kBtnLeft) ) // mode release (logique)
  2. (ASystem::GetButtonsState()  &  (kBtnRight|kBtnLeft) ) // mode debug (hein!?!)


 
Je n'ai pas (encore) touché aux flags de compilation, et quand bien meme, inverser le sens d'évaluation des expressions me semble impossible (ou en tout cas complètement suicidaire!).
 
C'est passqu'il ne m'aime pas ou ca le fait chez vous aussi?  
Ca fait peur ça!  :ouch:

Reply

Marsh Posté le 20-10-2006 à 11:31:28   

Reply

Marsh Posté le 20-10-2006 à 15:54:43    

la priorité des opérateurs ne change jamais en C++. C'est toujours la même qu'en C.

Reply

Marsh Posté le 20-10-2006 à 22:56:14    

jesus_christ a écrit :

la priorité des opérateurs ne change jamais en C++. C'est toujours la même qu'en C.


 
Ben oui j'espere bien... Idem elle ne devrait pas non plus changer en mode debug ou release ;)

Reply

Marsh Posté le 21-10-2006 à 00:04:29    

en l'occurence, si kBtnRight & kBtnLeft sont des constantes, un:
 
if( (ASystem::GetButtonsState()&kBtnRight)  |  kBtnLeft )  
 
n'est pas logique. autant écrire if(1)


Message édité par bjone le 21-10-2006 à 15:42:41
Reply

Marsh Posté le 23-10-2006 à 09:48:22    

Es-tu sûr de ce que tu annonces ?
J'ai testé ce qui suit en "Release" et "Debug" avec MS-VS 2005 Pro et cela me retourne toujours "Release"...

Code :
  1. #include <iostream>
  2. const int BG = 1;
  3. const int BD = 2;
  4. int
  5. maFonction()
  6. {
  7. return 4;
  8. }
  9. int
  10. main( int argc, char** argv )
  11. {
  12. if( maFonction() & BG | BD )
  13.  std::cout << "Release" << std::endl;
  14. else
  15.  std::cout << "Debug" << std::endl;
  16. return 0;
  17. }

Reply

Marsh Posté le 23-10-2006 à 10:20:24    

bb138 a écrit :


Code :
  1. if( maFonction() & BG | BD )



Les tests booléens, c'est plutôt '&&' ou '||' ou ca n'a rien à voir avec la question ?


---------------
Töp of the plöp
Reply

Marsh Posté le 23-10-2006 à 11:24:08    

bb138 a écrit :

Es-tu sûr de ce que tu annonces ?
const int BG = 1;-> 001 en binaire
const int BD = 2;->010 en binaire
int
maFonction()
{
 return 4; -> 100 en binaire
}
 
int
main( int argc, char** argv )
{
 if( maFonction() & BG | BD )
             // 100 & 001 = 000 (& binaire)
             // 000 | 010 = 010 == 2
             // le if devient -> if (2) donc toujours "vrai"
  std::cout << "Release" << std::endl;
 else
  std::cout << "Debug" << std::endl;
 
 return 0;
}


 

Reply

Marsh Posté le 23-10-2006 à 11:37:19    

_darkalt3_ a écrit :

Les tests booléens, c'est plutôt '&&' ou '||' ou ca n'a rien à voir avec la question ?


ah oui ok on parle de masques [:joce]


---------------
Töp of the plöp
Reply

Marsh Posté le 23-10-2006 à 13:28:12    

breizhbugs > Je suis tout à fait d'accord avec toi mais si tu reprends le post initial :

Code :
  1. ( (ASystem::GetButtonsState()&kBtnRight)  |  kBtnLeft) ) // mode release (logique)
  2. (ASystem::GetButtonsState()  &  (kBtnRight|kBtnLeft) ) // mode debug (hein!?!)


Avec ce fontionnement, mon bout de code aurait donné :
- En release : ce que tu as décrit ( 100 & 001 = 000 et 000 | 010 = 010 donc toujours vrai)
- En Debug : d'après le fonctionnement décrit par jimko : ( 100 & ( 001 | 010)) -> 100 & 011 = 000 donc toujours faux... ce que je dis ne pas avoir retrouvé.
 
D'où ma question pour savoir s'il est vraiment sûr de ce qu'il annonce.

Reply

Marsh Posté le 23-10-2006 à 13:58:49    

:??:
 
ce que j'ai annoncé c'est ce que tu as prouvé par la suite :??:
(comprends pas là)

Reply

Marsh Posté le 23-10-2006 à 13:58:49   

Reply

Marsh Posté le 23-10-2006 à 14:03:27    

moi ce que j'annonce c'est qu'écrire:
( (ASystem::GetButtonsState()&kBtnRight)  |  kBtnLeft)  
c'est écrire un bug :D


Message édité par bjone le 23-10-2006 à 14:06:50
Reply

Marsh Posté le 23-10-2006 à 14:40:27    

bjone > je suis d'accord avec toi (non non ce n'est pas vrai je ne suis pas toujours d'accord avec tout le monde !)
 
... Je pense que jimko a du faire une boulette quand il a testé son code en "Debug" et "Release"...

Reply

Marsh Posté le 23-10-2006 à 15:51:31    

oué c'est bizarre son truc (il aurait ptet une beta :??:)

Reply

Marsh Posté le 27-10-2006 à 18:28:59    

bjone a écrit :

oué c'est bizarre son truc (il aurait ptet une beta :??:)


 
Skuzez moi j'étais en vacances imprévues (ça arrive!) :sleep:  
 
Bon déjà, bien évidemment je n'ai jamais voulu écrire ça (sinon faut changer de métier!)... J'avais ajouté le deuxieme bit "kBtnLeft" à la va-vite et sans faire gaffe, et ce qui m'a laissé perplexe c'est que je ne m'en suis rendu compte qu'en passant bien plus tard en mode release, alors qu'en debug ca faisait ce que je voulais à la base, et non ce que ca aurait du faire...
 
Sauf que ... j'avais du boire ce jour-la faut croire! Impossible à renouveler en effet, j'ai pas l'air con là! désolé...
 
La seule explication a part mon cerveau en version beta lui-meme, c'aurait été que kBtnLeft vale 0 en mode debug, et 1 en mode release!...
Et personne n'y a pensé?  :D  okok je détourne la conversation, et je ne pense pas avoir jamais fait dependre mes constantes du mode de debug!
 
Oups, merci quand meme!

Reply

Marsh Posté le 28-10-2006 à 02:09:08    

ça arrive.
 
moi j'ai déjà cherché un bug jusqu'à 5 heures du mat pour m'apercevoir le lendemain (après-midi) que j'avais tout ruiné :D


Message édité par bjone le 28-10-2006 à 02:28:35
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed