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 :

Portabilitée : Surcharge opérateur de comparaison


Sujet :

C++

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 103
    Par défaut Portabilitée : Surcharge opérateur de comparaison
    Bonjour,

    J'ai surchargé les 6 opérateurs de comparaison pour comparer un identifiant.
    La surcharge marche parfaitement sous Windows et Linux Mandriva 2007 mais lorsque je le met sur un server Unix ces surcharges ne fonctionnent plus ?? (Plus précisement il affiche toujours que les 2 identifiants sont différent) Or sur les autres plateformes ca marche.

    Voici l'appel :
    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
     
    system("cls");
    cout<<endl<<"\t\t\t\t\t\tOPERATEUR DE COMPARAISON"<<endl;
    cout<<"\t\t\t\t\t\t------------------------"<<endl<<endl;
     
    log<<"Test des opérateurs de comparaison";
    if((pm2.getID() < pm.getID()))
    cout<<" * ID de PM2 est plus petit que ID de PM"<<endl<<endl;
    f((pm.getID() <= pm2.getID()))
    cout<<" * ID de PM est plus petit ou egale a ID de PM2"<<endl<<endl;
    if((pm2.getID() > pm.getID()))
    cout<<" * ID de PM2 est plus grand que ID de PM"<<endl<<endl;
    if((pm2.getID() >= pm.getID()))
    cout<<" * ID de PM2 est plus grand ou egale a ID de PM"<<endl<<endl;
    if((pm.getID() == pm2.getID()))
    cout<<" * ID de PM est egale a ID de PM2"<<endl<<endl;
    if((pm.getID() != pm2.getID()))
    cout<<" * ID de PM est different de ID de PM2"<<endl<<endl; 
    system("PAUSE");
    break;
    et le code :
    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
     
    int Identifiant::operator<(Identifiant & id)
    {
    	if((strcmp(toString(), id.toString())) == -1)
    		return 1;
    	return 0;
    }
     
    int Identifiant::operator<=(Identifiant & id)
    {
    	if((strcmp(toString(), id.toString())) == -1)
    		return 1;
    	return 0;
    }
     
    int Identifiant::operator>(Identifiant & id)
    {
    	if((strcmp(toString(), id.toString())) == 1)
    		return 1;
    	return 0;
    }
     
    int Identifiant::operator>=(Identifiant & id)
    {
    	if((strcmp(toString(), id.toString())) == 1)
    		return 1;
    	return 0;
    }
     
    int Identifiant::operator==(Identifiant & id)
    {
    	if((strcmp(toString(), id.toString())) == 0)
    		return 1;
    	return 0;
    }
     
    int Identifiant::operator!=(Identifiant & id)
    {
    	if((strcmp(toString(), id.toString())) != 0)
    		return 1;
    	return 0;
    }
    La méthode getID() retourne biensur un objet Identifiant.
    Avez vous une idée sur la raison du mauvais fonctionnement ???

    Merci
    Bonne journée

  2. #2
    Membre éprouvé
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Décembre 2005
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Décembre 2005
    Messages : 109
    Par défaut
    J'ai trois questions :
    - Est-ce normal que des opérateurs de comparaison ne renvoient pas un booléen ?
    - Est-ce normal que tu ne puisse pas utiliser tes opérateurs de comparaison sur des objets constant ?
    - Es-tu sur que strcmp("A", "B") ne renverra que -1, 0 ou 1 ?

  3. #3
    Membre chevronné
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    349
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2005
    Messages : 349
    Par défaut
    Citation Envoyé par Volune
    Es-tu sur que strcmp("A", "B") ne renverra que -1, 0 ou 1 ?
    A mon avis ça vient de là. Dans les spec de strcmp ça renvoie une valeur positive, négative ou nulle. Sûrement que sous Windows et Linux c'est par hasard toujours -1, 1 ou 0, alors que sous Unix ce n'est pas le cas.

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    577
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 577
    Par défaut
    au fait, pourquoi utiliser "strcmp" qui est + du C qu'autre chose dans un développement purement C++ ?

  5. #5
    Membre expérimenté
    Avatar de David Fleury
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    253
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 253
    Par défaut
    et pourquoi écrire tous les opérateurs de comparaison alors qu'ils se déduisent tous de < et == ?

  6. #6
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    <= et >= sont pas bons...

    Il les réecrit à chaque fois tout simplement parce que c'est en O(n).
    Si on définit <= comme < ou =, alors on parcourera deux fois la chaîne, ce qui est inutile.

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 103
    Par défaut
    1.J'ai écrit les 6 opérateurs car on me l'a demandé dans mon dossier donc si je les mets pas
    2.Pour les objets constant, pourrait tu m'expliquer pourquoi ??
    3.Je ne sais pas si c'est du au hasard mais je viens de le tester sur un server Unix sur td176.Testdrive.hp.com et la ça marche nickel.
    C'est peut être du au fait que lors de mon test sur le Sun de mon école j'avais mit comme compilo CC ??
    Je vais aller le retester aujourd'hui

  8. #8
    Membre éprouvé
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Décembre 2005
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Décembre 2005
    Messages : 109
    Par défaut
    Citation Envoyé par loufoque
    <= et >= sont pas bons...

    Il les réecrit à chaque fois tout simplement parce que c'est en O(n).
    Si on définit <= comme < ou =, alors on parcourera deux fois la chaîne, ce qui est inutile.
    avec a < b et a == b :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    a <= b équivaut à !(b < a)
    a >  b équivaut à  (b < a)
    a >= b équivaut à !(a < b)
    a != b équivaut à !(a == b)
    et dans certaines circonstances on peut dire (a == b) équivaut à !(a < b || b < a)

  9. #9
    Membre éprouvé
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Décembre 2005
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Décembre 2005
    Messages : 109
    Par défaut
    Citation Envoyé par Dimitri_87
    2.Pour les objets constant, pourrait tu m'expliquer pourquoi ??
    Ce n'est qu'un détail, mais comme tes opérateurs n'acceptent pas d'objet constant en paramètre, et ne peuvent pas s'appliquer à des objets constants, tu ne peux pas faire l'exemple suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    {
        Identifiant const id1;
        Identifiant const id2;
        std::cout << std::boolalpha << (id1 < id2) << std::endl;
    }


    Citation Envoyé par Dimitri_87
    3.Je ne sais pas si c'est du au hasard mais je viens de le tester sur un server Unix sur td176.Testdrive.hp.com et la ça marche nickel.
    C'est peut être du au fait que lors de mon test sur le Sun de mon école j'avais mit comme compilo CC ??
    Je vais aller le retester aujourd'hui
    A mon avis, ce n'est pas que ça ne fonctionne pas sur un compilateur, mais plutot que par chance ça fonctionne sur les autres.
    On peut par exemple lire ceci dans une page man de strcmp :
    La fonction strcmp() compare les deux chaînes s1 et s2.
    Elle renvoie un entier négati, nul, ou positif, si s1 est
    respectivement inférieure, égale ou supérieure à s2.
    Imagine que la fonction strcmp renvoie -2, 0, ou 2. C'est autorisé d'après la description de la fonction. Mais ton code ne l'accepte pas.

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 103
    Par défaut
    En effet cela semble être le problème j'ai donc changé mes comparaisons, je regarde maintenant si elle est < 0, == 0 ou > 0.
    Je testerais une nouvelle fois sur la Sun demain.

    Merci

  11. #11
    Membre expérimenté
    Avatar de David Fleury
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    253
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 253
    Par défaut
    Citation Envoyé par Volune
    avec a < b et a == b :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    a <= b équivaut à !(b < a)
    a >  b équivaut à  (b < a)
    a >= b équivaut à !(a < b)
    a != b équivaut à !(a == b)
    et dans certaines circonstances on peut dire (a == b) équivaut à !(a < b || b < a)
    pas mieux...

    et comme la définition de ces opérateurs est tellement standard que le C++ fournit même un entête qui les définit exactement comme ça ( dans <utility> )

    Sinon c'est plutôt la méthode Identifiant::toString() qui pourrait être intéressante à détailler ( mais pourquoi passer par une "sérialisation" dans une chaîne pour ces opérateurs ?).
    et comme d'hab, pourquoi les <, == ne sont pas des fonctions externes à la classe au lieu de méthode.

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 103
    Par défaut
    Ok le problème est résolu c'était bien ce que vous disiez.
    On ne m'y reprendra plus à tester les égales à -1 ect..

    Encore Merci

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

Discussions similaires

  1. Surcharge opérateur comparaison et pointeurs
    Par jp.lorient dans le forum Débuter
    Réponses: 12
    Dernier message: 04/05/2009, 14h09
  2. surcharge opérateur << et >>
    Par Azharis dans le forum Débuter
    Réponses: 11
    Dernier message: 02/11/2005, 21h22
  3. implémentation des opérateurs de comparaison
    Par niko8181 dans le forum Algorithmes et structures de données
    Réponses: 5
    Dernier message: 28/04/2005, 11h58
  4. Surcharge opérateurs
    Par ghostdogpr dans le forum C++
    Réponses: 5
    Dernier message: 18/03/2005, 11h51
  5. Réponses: 15
    Dernier message: 25/01/2005, 16h51

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