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 :

Convertir chaines de caracteres en numerique


Sujet :

C

  1. #1
    Membre averti
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Avril 2020
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Avril 2020
    Messages : 18
    Par défaut Convertir chaines de caracteres en numerique
    bonsoir,
    un probleme qui parait simple, mais je galere

    j'ai 2 variables char coord1[9] contenu = 8.437500
    char coord2[10] contenu = 43.084937
    ce sont des coordonnées Lat,Long gps

    j'ai bessoin de les retravailler en valeur numerique (division et soustraction)

    j'ai essayé plein de chose, mais sans résultat valable, je me retrouve avec les entiers

    si quelqu'un pouvait me mettre sur la voie

    merci et bonne soirée

  2. #2
    Membre averti
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Avril 2020
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Avril 2020
    Messages : 18
    Par défaut
    je repond a ma question

    solution trouvé
    double r1;
    double r2;

    pourquoi double ???

    r1=atof(coord1);
    r2=atof(coord2);

    je peu manipuler les 2 variables en tant que valeur numerique (addition,soustraction)

    ce n'est peut-etre pas de la vrai programmation mais ca marche.
    je suis a votre ecoute ou plutot a vous lire
    merci

  3. #3
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 600
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 600
    Par défaut
    Bonjour,

    Quelle serait le meilleur moyen de stocker de nombre? Réponse le meilleur rapport qualité/simplicité c'est utiliser des double.
    Et la fonction la plus simple pour obtenir cela c'est atof().
    Tu as donc tout juste, et c'est de la vraie programmation.

    Maintenant attention, certaines trames GPS sont en degrés . minutes secondes et ne sont pas en degrés décimaux, dans ce cas il faut effectuer la transformation différemment.

  4. #4
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 786
    Par défaut
    Citation Envoyé par dalfab Voir le message
    Quelle serait le meilleur moyen de stocker de nombre? Réponse le meilleur rapport qualité/simplicité c'est utiliser des double.
    Non c'est surtout qu'avec les flottants, on ne peut pas les représenter tous en informatique. Donc, on prend le type ayant la meilleure précision (double précision, sur 64 bits) afin d'éviter les erreurs de conversion au maximum.
    C'est comme cela que je comprends le truc "If the converted value would be out of the range of representable values by a double, it causes undefined behavior."


    Citation Envoyé par dalfab Voir le message
    Et la fonction la plus simple pour obtenir cela c'est atof().
    D'après la documentation de la fonction atof, ce serait la fonction strtod la + multiplateforme (<- liens cplusplus.com en anglais)

  5. #5
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 600
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 600
    Par défaut
    atof() et strtod() sont toutes les 2 dans le standard, pour les cas simples atof() est suffisante.
    en C++ on préférera std::stod() ou std::from_chars().

    Sinon pour le type double il y a risque de perte de précision à partir du 17ième chiffre, et dans le cas que tu cites, tu as besoin de 9 chiffres significatifs (3+6), le double est donc tout à fait suffisant.

  6. #6
    Membre très actif
    Avatar de sambia39
    Homme Profil pro
    No Comment
    Inscrit en
    Mai 2010
    Messages
    551
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : No Comment
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mai 2010
    Messages : 551
    Par défaut
    Bonsoir,

    Citation Envoyé par dalfab Voir le message
    atof() et strtod() sont toutes les 2 dans le standard, pour les cas simples atof() est suffisante.
    en C++ on préférera std::stod() ou std::from_chars().
    Suffisant avec de grands risques qu'il le faudrait préciser. Car si atof() ne parvient pas à représenter ce qu'il faut convertir pour une raison ou une autre ; la valeur du résultat ne peut en aucun cas être représentée et on obtient alors un comportement indéterminé et je ne parle même pas des implications qui pourraient avoir dans l'exécution d'environnement strict.
    Citation Envoyé par dalfab Voir le message
    Sinon pour le type double il y a risque de perte de précision à partir du 17ième chiffre, et dans le cas que tu cites, tu as besoin de 9 chiffres significatifs (3+6), le double est donc tout à fait suffisant.
    Il faut comprendre que atof ne détecte en aucune façon les erreurs de débordement donc, même-si la variable qui contiendra le résultat est du type double; rien ne garantie que lors de la conversion, la valeur renvoyée par la fonction atof est correct; sans oublier que atof est déprécié.

    À bientôt.

  7. #7
    Membre Expert
    Femme Profil pro
    ..
    Inscrit en
    Décembre 2019
    Messages
    724
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 95
    Localisation : Autre

    Informations professionnelles :
    Activité : ..

    Informations forums :
    Inscription : Décembre 2019
    Messages : 724
    Par défaut
    Citation Envoyé par sambia39 Voir le message
    sans oublier que atof est déprécié.
    Bonjour,

    J'ai trouvé cette affirmation plutôt détonnante, alors j'ai quand même pris le temps de vérifier. J'ai fait un test en ligne sur coliru avec le dernier gcc en std c2x, parcouru le dernier brouillon n2479, et il s'avère qu'il n'en est rien. La fonction atof() n'est nullement dépréciée.

    Bien sûr, ceci n'enlève rien au fait que dans la pratique son usage est effectivement déconseillé, voire même interdit dans certaines conventions. Mais voilà, il était nécessaire de tempérer un peu.

  8. #8
    Membre très actif
    Avatar de sambia39
    Homme Profil pro
    No Comment
    Inscrit en
    Mai 2010
    Messages
    551
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : No Comment
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mai 2010
    Messages : 551
    Par défaut
    Citation Envoyé par kaitlyn Voir le message
    Bonjour,

    J'ai trouvé cette affirmation plutôt détonnante, alors j'ai quand même pris le temps de vérifier. J'ai fait un test en ligne sur coliru avec le dernier gcc en std c2x, parcouru le dernier brouillon n2479, et il s'avère qu'il n'en est rien. La fonction atof() n'est nullement dépréciée.
    Tout ce qui est décrit dans la norme ne veut pas dire que cela ne rentre pas en conflit avec la pratique ou certaines exigences. (et je cite au passage ce qui est écrit dans la norme.)


    .........
    The functions atof, atoi, atol, and atoll need not affect the value of the integer expression errno on an error. If the value of the result cannot be represented, the behavior is undefined. The atof function converts the initial portion of the string pointed to by nptr to double representation. Except for the behavior on error, it is equivalent to strtod(nptr, (char **)NULL)...


    La norme précise un comportement indéterminé donc, un résultat qui n'est pas défini ce qui ne résout absolument pas le problème et donc les compilateurs pourront faire a leurs guises voir ignorer cette erreur. Exemple : admettant une chaîne de caractères littérale suivante char *other = "123456,654321"; [c]atof[\c] renverra: "123456,000000", le compilateur, a-t-il détecté ou afficher comme quoi il y a erreur de conversion ?. La fonction atof garantie-t-elle une ou voir deux des conditions suivantes :


    • La fonction atof est elle capable de faire la différence entre une chaîne qui contient 0 et une chaîne de caractère impossible à convertir ?
    • La fonction atof, permet-elle une prévention au débordement ?
    • La fonction atof est elle capable de faciliter ou permettre la détection des erreurs dites erreurs de domaine mathématique (erreurs dues au fait qu'un paramètre n'est pas supporté ou correspond à une valeur spéciale comme l'infini).


    Si la fonction répond à une des deux exigences alors oui elle peut être considérée comme sûr, car elle apporte certaines garanties ou sûreté hors, se n'est pas le cas et de plus elle n'est point dite déprécié pour autant. Pourquoi ?, tout simplement parce que la norme laisse la possibilité de l'emploi de cette fonction dans un contexte bien précis, c'est-à-dire que l'on est sûr que la chaîne de caractères en paramètre/argument représente un nombre et rien d'autre. Il est alors possible de convertir la chaîne de caractères avec les fonctions atof. La norme rajoute également qu'elle est similaire strtod fonction comme atof qui assure un meilleur contrôle de conversion que atof ne possède pas. Aux finales, si vous employez la fonction sans être sûr de la nature du paramètre de la fonction, vous aurez un comportement indéterminé. autant dire que atof est déprécié dans ce cas.


    Citation Envoyé par kaitlyn Voir le message
    Bien sûr, ceci n'enlève rien au fait que dans la pratique son usage est effectivement déconseillé, voire même interdit dans certaines conventions. Mais voilà, il était nécessaire de tempérer un peu.
    Il n'y a rien à tempérer et rien n'est détenant dans le contexte actuel, j'apporte des précisions; je me cite:
    Suffisant avec de grands risques qu'il le faudrait préciser.
    Il faut donc s'assurer que la chaîne est bel et bien et restera une représentation de nombres que l'on doit fournir à la fonction et donc c'est à vous développeurs de garantir ce point pas la norme, car elle précise que le comportement est indéterminé et qu'il existe d'autre outils adapté. Donc, dépréciée pour une pratique dont on n'est pas sûr de la représentation de l'argument.

  9. #9
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    18 350
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 18 350
    Par défaut
    1 écart d'1 seconde d'arc=30m donc attention aux problèmes de précisions.
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

  10. #10
    Membre Expert
    Femme Profil pro
    ..
    Inscrit en
    Décembre 2019
    Messages
    724
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 95
    Localisation : Autre

    Informations professionnelles :
    Activité : ..

    Informations forums :
    Inscription : Décembre 2019
    Messages : 724
    Par défaut
    Rebonjour,

    Je me positionnais sur le plan de la sémantique qui a une place importante en C et en C++, et le terme "déprécié" y est lourd de sens. Alors évidemment oui j'agrée que l'on puisse considérer la fonction atof() comme obsolète, mais elle n'est pas dépréciée pour autant.

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

Discussions similaires

  1. Convertir chaine de caracteres en operation
    Par Marlan dans le forum Fortran
    Réponses: 6
    Dernier message: 17/03/2011, 15h14
  2. [VB]Convertir une chaine de caractere en entier
    Par budylove dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 21/02/2006, 11h06
  3. Convertir chaine de caractere
    Par Antoine NSG dans le forum Langage
    Réponses: 3
    Dernier message: 29/11/2005, 15h32
  4. convertir un nombre en chaine de caractere
    Par c_moi_c_moi dans le forum Oracle
    Réponses: 3
    Dernier message: 23/11/2005, 11h24
  5. [langage]trie sur numérique et chaîne de caractère
    Par helene22500 dans le forum Langage
    Réponses: 9
    Dernier message: 31/05/2005, 14h19

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