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 :

Comparer 2 chaines de caractère contenant des float


Sujet :

C

  1. #1
    Membre régulier
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juin 2010
    Messages
    210
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2010
    Messages : 210
    Points : 81
    Points
    81
    Par défaut Comparer 2 chaines de caractère contenant des float
    Bonjour,

    Est-il possible de comparer 2 variables de type char* contenant des valeurs en float.
    Par exemple :
    MaVariable1="8.0"
    MaVariable2="10.5"

    Comment savoir si MaVariable1 est < ou = à MaVariable2

    Bien sûr ceci serait simple si les variables étaient de type float mais là ce n'est pas le cas puisque ce sont des chaînes de caractères.

    J'ai bien pensé à ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    if(strcmp(MaVariable1, MaVariable2)==0)
    {
         //Mes variables sont identiques
     
    }
    Mais ceci est une comparaison de chaîne de caractères et non une comparaison de valeur de chaine de caractère.
    Je ne sais pas si je me fais bien comprendre.
    J'espère que oui.
    Merci pour votre aide.

  2. #2
    Membre émérite
    Avatar de TheGzD
    Homme Profil pro
    Ingénieur/ Docteur en Informatique
    Inscrit en
    Avril 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur/ Docteur en Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 327
    Points : 2 677
    Points
    2 677
    Par défaut
    Je vois 2 solutions :
    - soit tu convertis te char* en float (ou double) et tu les compares simplement : utilise par exemple la fonction strtod.
    - soit tu te fixes une règle de formatage de tes chaines de caractères en amont, pour qu'elles fassent toutes la même taille, en les complétant avec des 0 (=zéro) : par exemple MaVariable1="08.0" et MaVariable2="10.5" (après tu peux simplement utiliser ton strcmp).

  3. #3
    Membre régulier
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juin 2010
    Messages
    210
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2010
    Messages : 210
    Points : 81
    Points
    81
    Par défaut
    OK Merci
    Je vais tenter la 1ère solution qui me parait la plus adaptée puisque ces variables sont comme leur nom l'indique des variables et celles-ci sont indiquées par des utilisateurs donc pas possible de les formater comme tu dis dans la 2è solution.
    Je vais tester ça et te tiens informé.

  4. #4
    Membre régulier
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juin 2010
    Messages
    210
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2010
    Messages : 210
    Points : 81
    Points
    81
    Par défaut
    Merci pour l'info.
    La fonction strtod() me permet donc de comparer mes variables.
    Merci

  5. #5
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 721
    Points : 31 044
    Points
    31 044
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Korben-Dallas Voir le message
    La fonction strtod() me permet donc de comparer mes variables.
    Euh non, pas tout à fait.
    En fait, elle a juste pour but de convertir une string en double. Ensuite, une fois que tu as en main tes 2 doubles correspondant aux valeurs littérales de tes 2 strings, tu peux les comparer de façon classique...

  6. #6
    Membre régulier
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juin 2010
    Messages
    210
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2010
    Messages : 210
    Points : 81
    Points
    81
    Par défaut
    Merci
    C'est justement ce que j'ai fait.

    Utilisation de la fonction strtod() afin de convertir mes variables chaine en double et ensuite et seulement ensuite je les ai comparées à l'aide d'un IF()

    Et là ça marche impec.

  7. #7
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 721
    Points : 31 044
    Points
    31 044
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Korben-Dallas Voir le message
    Et là ça marche impec.
    Attention toutefois aux dangers inhérents à la façon dont sont codés les doubles.
    Car la méthode de codage d'un double en binaire est de façon intrinsèque parfois imprécise. Parce que le nombre décimal peut, une fois codé en binaire, devenir indéfini.
    Exemple: 0.21 => il y a de grandes chances qu'il devienne, au final, 0.20999999999999999

    Généralement c'est pas très très grave dans les applications courantes. Ca peut le devenir pour les trucs très pointus comme les transactions commerciales, les calculs de trajectoires etc.

    Et donc malheureusement parfois, deux nombres qui devraient être égaux ne sont pas vus ainsi parce que l'un, issu d'un calcul, a été décalé d'un pouillième par rapport à l'autre.

    Ceci dit, si tes deux nombres égaux à l'origine sont traités de la même façon, alors ils devraient ressortir égaux à l'arrivée...

  8. #8
    Membre régulier
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juin 2010
    Messages
    210
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2010
    Messages : 210
    Points : 81
    Points
    81
    Par défaut
    En fait c'est juste pour comparer 2 chaines de caractère qui représentent la version du logiciel.
    MaVariable1 est la chaine de caractères récupérée dans la base de registre
    MaVariable2 est la chaine de caractères récupérée dans un fichier de conf INI

    Donc les 2 variables sont soumises au même traitement (normalement)
    Et il ne devrait (normalement) pas y avoir ce fameux pb de double

  9. #9
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 721
    Points : 31 044
    Points
    31 044
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Korben-Dallas Voir le message
    Donc les 2 variables sont soumises au même traitement (normalement)
    Et il ne devrait (normalement) pas y avoir ce fameux pb de double
    C'était juste pour élargir un peu le contexte et embrayer sur le danger à comparer des doubles. Mais effectivement, dans ton cas il ne devrait pas y avoir de problème.

    Maintenant, autre voie d'exploration et de brainstorming, tu transformes ta version (exemple "2.3") en double => 2.3 pour comparer les versions. Je vois l'idée. Mais as-tu pensé à l'évolutivité ? Comment feras-tu si demain ton logiciel commence à avoir un versionning plus complexe style "2.3.05" ou "2.3.05.6_r4" ??? Je n'attends pas de réponse. C'est juste pour t'indiquer d'autres dangers possibles et te donner l'idée de réfléchir à une autre façon de faire...

  10. #10
    Membre chevronné
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Points : 1 750
    Points
    1 750
    Par défaut
    S'il s'agit de comparer des versions de logiciel, je te conseille une autre solution que de comparer des "double". Tiens compte des remarques de Sve@r. Ces problèmes de précision des valeurs de type "double" et l'histoire de la numérotation des version peuvent éventuellement poser problème.

  11. #11
    Membre régulier
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juin 2010
    Messages
    210
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2010
    Messages : 210
    Points : 81
    Points
    81
    Par défaut
    En fait, le pb de versioning est vite réglé puisque les versions du logiciel intègre la version et le Build.
    Par exemple :
    v10.5.1820
    Ceci est réparti en 2 variables distinctes (une pour la version, ici 10.5 et l'autre pour le Build, ici 1820) ce qui fait que je compare donc 2 variables différentes pour avoir la version exacte du logiciel.
    MaVersion1_BdR=10.5
    MaVersion2_INI=10.5

    MonBuild1_BdR=1820
    MonBuild2_INI=1820

    Vous voyez ce que je veux dire ?
    Donc normalement je ne devrais pas avoir ces pb, et puis mon pb devra aussi évoluer avec les différentes versions puisqu'en fonction des version, les traitements sont différents et seront donc à évoluer aussi.

  12. #12
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 721
    Points : 31 044
    Points
    31 044
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Korben-Dallas Voir le message
    En fait, le pb de versioning est vite réglé puisque les versions du logiciel intègre la version et le Build.
    Par exemple :
    v10.5.1820
    Ceci est réparti en 2 variables distinctes (une pour la version, ici 10.5 et l'autre pour le Build, ici 1820) ce qui fait que je compare donc 2 variables différentes pour avoir la version exacte du logiciel.
    MaVersion1_BdR=10.5
    MaVersion2_INI=10.5

    MonBuild1_BdR=1820
    MonBuild2_INI=1820

    Vous voyez ce que je veux dire ?
    Oui on comprend. C'était juste pour t'exposer d'autres soucis/évolutions possibles à garder dans un coin de ton cerveau...

  13. #13
    Membre régulier
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juin 2010
    Messages
    210
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2010
    Messages : 210
    Points : 81
    Points
    81
    Par défaut
    OK Pas de pb.
    En tout cas merci pour ces infos

  14. #14
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Mai 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 10
    Points : 9
    Points
    9
    Par défaut
    As-tu essayé avec le "sscanf" ? ça marche très bien aussi!! et peu etre mieux que le strtod() car tu peux meme régler le nombre de décimales.

  15. #15
    Membre régulier
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juin 2010
    Messages
    210
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2010
    Messages : 210
    Points : 81
    Points
    81
    Par défaut
    Non je n'ai pas essayé mais en même tps, je préfère utiliser les fonctions prévues à cet effet au lieu de "bidouiller".

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

Discussions similaires

  1. Comparer des chaines de caractères comme des nombres
    Par PhilLU dans le forum Requêtes
    Réponses: 5
    Dernier message: 12/11/2014, 13h39
  2. Réponses: 2
    Dernier message: 07/08/2012, 16h20
  3. Chaine de caractères contenant des antislash
    Par Mides dans le forum Débuter avec Java
    Réponses: 6
    Dernier message: 27/04/2012, 09h32
  4. Réponses: 4
    Dernier message: 24/10/2011, 12h17
  5. Chaine de caractère, contenant des variables, à éxecuter
    Par kerozenium dans le forum Développement
    Réponses: 4
    Dernier message: 18/06/2010, 11h25

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