[C++] Problème de surcharge d'opérateur

Problème de surcharge d'opérateur [C++] - C++ - Programmation

Marsh Posté le 22-09-2004 à 02:54:13    

J'utilise des surcharges d'opérateurs pour déterminer si un point est plus petit, égal ou plus grand qu'un autre.
 
mais voila mon problème, ya un cas ou le point est plus petit et pourtant le bool retourner est true
 

DEBUT        (6,2)
FIN          (8,3)
s2.debut()   (8,4)
s2.fin()     (9,6)
intersection (7.33333,2.66667)


 
ma condition
 

Code :
  1. if (DEBUT <= intersection && FIN >= intersection
  2.       && s2.debut() <= intersection && s2.fin() >= intersection) {
  3.      return 1;
  4.   }


 
mes surcharges
 

Code :
  1. bool operator == (const Point & p1, const Point & p2) {
  2.   if (p1.abs() == p2.abs() && p1.ord() == p2.ord()) {
  3.     return 1;
  4.   }
  5.   return 0;
  6. }
  7. bool operator > (const Point & p1, const Point & p2) {
  8.   if (p1.abs() > p2.abs()
  9.       || (p1.abs() == p2.abs() && p1.ord() > p2.ord())) {
  10.      return 1;
  11.   }
  12.   return 0;
  13. }
  14. bool operator >= (const Point & p1, const Point & p2) {
  15.   if (p1 > p2 || p1 == p2) {
  16.     return 1;
  17.   }
  18.   return 0;
  19. }

Reply

Marsh Posté le 22-09-2004 à 02:54:13   

Reply

Marsh Posté le 22-09-2004 à 09:24:54    

2 trucs : utilises true et false plutôt que 0 et 1.
 
D'autre part, l'abscisse de ton intersection est inférieure à l'abscisse de s1.debut et s2.fin, le point n'est donc pas entre les deux, le test est donc négatif.  
 
Tu essayes de calculer l'intersection de 2 droites ou de 2 segments ?

Reply

Marsh Posté le 22-09-2004 à 13:43:35    

entre 2 segments
 
je sais que l'abscisse de l'intersection est plus petite que s1.debut, c'est justement le test qui foire :D

Reply

Marsh Posté le 22-09-2004 à 13:58:36    

merde maintenant ca fonctionne :/

Reply

Marsh Posté le 22-09-2004 à 16:16:57    

ca fait 1hrs30 que je bosse pour finalement me rentre compte que c'est l'un des 2 binaire du prof qui est buggé :D
 
pour un fichier de 100 segments, son binaire 1 trouvait 899 intersection (comme moi) alors que son binaire 2 en trouvait 325
 
et comme un con moi depuis le début je comparais mes résultats avec son 2e binaire :D
 
lui est envoyé un mail :o

Reply

Marsh Posté le 22-09-2004 à 19:15:27    

Lam's a écrit :

2 trucs : utilises true et false plutôt que 0 et 1.


Bon conseil, bien que le compilo fasse la conversion automatiquement.
 
Accessoirement, sachez que si false vaut toujours 0, true ne vaut pas toujours 1 en C/C++.
false ça vaut (!0). Sous MSVC et GCC ça fait 1, mais sous certains compilos ça peut être -1

Reply

Marsh Posté le 22-09-2004 à 21:11:03    

jesus_christ a écrit :

Bon conseil, bien que le compilo fasse la conversion automatiquement.


 
non [:le kneu]

Reply

Marsh Posté le 22-09-2004 à 21:15:00    

et pourquoi ?
Une fonction bool doit retourner un bool, pas un entier. Dans ce cas, il y a conversion implicite en bool. Et true ne vaut pas toujours 1, pas contre 1 ça vaut toujours true.

Reply

Marsh Posté le 22-09-2004 à 21:15:55    

ben non pas toujours, et la conversion automatique n'est pas garanti.

Reply

Marsh Posté le 22-09-2004 à 21:16:18    

Citation :

By definition, true has the value 1 when converted to an integer and false has the value 0. Conversely,
integers can be implicitly converted to bool values: nonzero integers convert to true and 0
converts to false.

Reply

Marsh Posté le 22-09-2004 à 21:16:18   

Reply

Marsh Posté le 22-09-2004 à 21:17:32    

cris56 a écrit :

Citation :

By definition, true has the value 1 when converted to an integer and false has the value 0. Conversely,
integers can be implicitly converted to bool values: nonzero integers convert to true and 0
converts to false.




 
Norme C ?
bon ben je me mets à jour , je me rappelles des pbs assez chiants sur gcc 2.95.2 voire le 3.0

Reply

Marsh Posté le 22-09-2004 à 21:19:41    

stroustrup 3e edition, mais ya un "can be" ?

Reply

Marsh Posté le 22-09-2004 à 21:29:43    

cris56 a écrit :

stroustrup 3e edition, mais ya un "can be" ?


Nan, mais il utilise bien le mot "converted". Et les compilateurs, ils n'aiment pas convertir de façon implicite.
 
Donc, le code suivant générera 2 warnings (selon les compilos):

Code :
  1. double d = 1.0;
  2. int i = d;
  3. bool b = i;


 
Alors que celui-là n'en fera aucun:

Code :
  1. int i = 1;
  2. bool b = !!i;


Message édité par Lam's le 22-09-2004 à 21:30:42
Reply

Sujets relatifs:

Leave a Replay

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