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 :

comportement étrange d'un test


Sujet :

C++

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    retraité
    Inscrit en
    Septembre 2006
    Messages
    286
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 83
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Septembre 2006
    Messages : 286
    Points : 0
    Points
    0
    Par défaut comportement étrange d'un test
    Bonjour,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (a == b && aa != bb)
    ne fonctionne pas!
    a est une partie de b est une partie de A)B)C)ou a et b sont testés sur les 4 premiers caractères.
    A et B sont acceptés:aa#bb
    A et C aussi!:aa==bb!
    Où est l'erreur?
    Merci pour vos expertises.

  2. #2
    Membre confirmé
    Femme Profil pro
    Développeur Java
    Inscrit en
    Décembre 2009
    Messages
    236
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2009
    Messages : 236
    Points : 491
    Points
    491
    Par défaut
    Bonjour,
    Désolée mais je ne comprend pas du tout la question. Pourrais tu expliciter un peu plus ton problème, et peut-être nous envoyer un morceau de code un peu plus parlant?
    Merci

  3. #3
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 948
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 948
    Points : 5 662
    Points
    5 662
    Par défaut
    Cia,

    Ce n'est pas ainsi qu'on compare des chaînes de caractères.

    Je te laisse chercher un peu, vu que c'est basique.

  4. #4
    Nouveau Candidat au Club
    Homme Profil pro
    retraité
    Inscrit en
    Septembre 2006
    Messages
    286
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 83
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Septembre 2006
    Messages : 286
    Points : 0
    Points
    0
    Par défaut
    bonjour,
    1)Je m'aperçois que le test fonctionne(la "logique" est une chose imparable!).
    Mais c'est la sélection de la chaine à tester qui n'est pas bonne!
    C'est déjà çà!
    2)de droggo:comment compare-t-on donc des chaines?
    a == b ou a != b c'est donc trop simple?
    Quelle(s) autre(s) solution(s)?
    A+++.

  5. #5
    Membre habitué Avatar de Xtrem_Voyageur
    Homme Profil pro
    Inscrit en
    Juin 2009
    Messages
    85
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2009
    Messages : 85
    Points : 154
    Points
    154
    Par défaut
    Jettes un oeil à string::compare, cela sera plus propre.
    (compare te retourne 0 si les 2 morceaux de chaîne sont identiques)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    std::string s1("2012.ABC");
    std::string s2("2012.XYZ");
     
    /* Voici comment traduire ton if */
    if(s1.compare(0,4,s2,0,4)==0  && s1.compare(5,std::string::npos,s2,5,std::string::npos)!=0)
    /* ou de manière équivalente */
    if(!s1.compare(0,4,s2,0,4) && s1.compare(5,std::string::npos,s2,5,std::string::npos))

  6. #6
    Nouveau Candidat au Club
    Homme Profil pro
    retraité
    Inscrit en
    Septembre 2006
    Messages
    286
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 83
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Septembre 2006
    Messages : 286
    Points : 0
    Points
    0
    Par défaut
    Merci/Bonjour,
    Oui c'est propre.
    J'avais trouvé cette écriture mais elle me paraît(paraissait)compliquée en "compar"aison des classiques == ou !=.Je ne l'avais pas retenu.
    Je ne suis pas un puriste mais string::compare doit être une fonction ou un mot-clef écrits par les concepteurs du C/C++,écriture qui doit contenir les conditions classiques comme ==,!=,<=,..etc avec des possibilités étendues ou puissantes les codes étant masqués pour le plus commun des mortels que je suis.
    Je retiens cette écriture quand même.
    Mais question:pourquoi c'est mieux?
    A+++

  7. #7
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 627
    Points : 30 692
    Points
    30 692
    Par défaut
    Salut,

    Il faut déjà voir si l'on parle bien de chaine de type std::string, ou si l'on parle de chaine "C style"...

    Avec les chaines de type std::string, il n'y a pas de problème : les opérateurs == et != fonctionnent parfaitement, mais, avec les chaines C style, il faut impérativement passer par strcmp et similaires

    En outre, il faut être très attentif à l'ordre de préséance de l'opérateur &&

    en effet, && représente un ET "optimisé" dans le sens où l'expression qui se trouve à sa droite ne sera testée que si l'expression qui se trouve à gauche a bel et bien renvoyé un résultat à true.

    C'est pour cette raison que le test
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    /* soit ptr proche de Type * ptr = NULL;*/
    if( ptr->doSomething() && ptr)
    {
        /* ...*/
    }
    provoquera un erreur à l'exécution (car le systeme est incapable d'appeler doSomething sur NULL) alors que le test
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    /* soit ptr proche de Type * ptr = NULL;*/
    if( ptr && ptr->doSomething())
    {
        /* ...*/
    }
    ne posera pas de problème, car ptr->doSomething ne sera effectué que si ptr n'est pas nul

  8. #8
    Nouveau Candidat au Club
    Homme Profil pro
    retraité
    Inscrit en
    Septembre 2006
    Messages
    286
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 83
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Septembre 2006
    Messages : 286
    Points : 0
    Points
    0
    Par défaut
    Je ne veux connaître QUE le C++ et éventuellement le C si on ne peut faire autrement avec transposition le plus tôt possible.Donc les bons string.
    Concernant les tests:
    1)je vois que == et != sont admis.
    2)que l'ordre de pré-séance est subtil:penser que les tests sont font de gauche à droite SI le test de gauche est possible on testera le test de gauche.Le test de gauche est dans une logique de "ET" même si c'est un "non" implicite().
    Donc merci à vous tous pour ces leçons particulières utiles à tous.
    (j'ai reconstruit le code qui donnait un résultat tordu)
    A+++.

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 25/02/2008, 08h32
  2. Comportement étrange apres une désinstallation
    Par Sunchaser dans le forum Excel
    Réponses: 4
    Dernier message: 06/08/2005, 19h44
  3. comportement étrange d'une jointure ...
    Par amenis dans le forum PostgreSQL
    Réponses: 5
    Dernier message: 10/02/2005, 21h27
  4. [Système][Runtime][Exec] Comportement étrange au lancement de BeSweet
    Par divxdede dans le forum API standards et tierces
    Réponses: 1
    Dernier message: 06/06/2004, 09h54
  5. Réponses: 2
    Dernier message: 22/09/2003, 11h23

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