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 :

tentative conversion string vers float


Sujet :

C

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 48
    Points : 37
    Points
    37
    Par défaut tentative conversion string vers float
    Bonjour

    Mon but est plutot simple , en faite je voudrais coder (ou recoder vu que je ne sais pas si elle existe) une fonction qui recupere un float a partir d'un pointeur qui pointe vers le premier caractere de la chaine mais ce n'est pas un point mais une virgule .

    Exemple :
    char *p;
    p = "57,89";

    sortie :
    float f = 57.89;

    J'ai rajouter des printf("OK"); pour tenter de trouver l'erreur , n'en tenez pas trop compte

    Question :
    1 - Ca segfault lors de l'apelle de my_getnbr , pourquoi ?
    2 - Lorsque je code ca sans la fonction my_getnbr (ca me rajoute des lignes inutiles) la fonction convertofloat se termine pendant le premier while apres avoir convertis correctement la partie entiere (quand p[count] == ',' d'apres moi) , pourquoi ? Comment resoudre le probleme ?

    Voila le code (attention ca pique au yeux ^^)
    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
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    #include <stdio.h>
     
    float converttofloat(char *p);
    int  my_getnbr(char p);
     
    int main ()
    {
    	char *pointeur;
     
    	pointeur = "47,87";
    	printf("%s\n",pointeur);
    	printf ("%f\n",converttofloat(pointeur));
    	return 0;
    }
     
    int my_getnbr(char p)
    {
    	if( (p >= '0') && (p <= '9') )
    		return ((int)p - 48);
    	else
    		return (-1);
    }
     
    float converttofloat(char *p)
    {
    	int i=0 ; 
    	int f=0 ; 
    	int count=0;
    	int countdec=0;
    	float result = 0;
     
    	printf("OK\n");
    	/*Recuperation de la partie entiere*/
    	while((p[count] != ',') || (p[count] != '\0') )
    	{
    		if(p[count] != ',')
    		{ i = my_getnbr(p[count]) ; i *= 10; }
    		count++;	
    	}
     
    	count++;
    	printf("OK\n");	
     
    	/*Recuperation de la partie decimale*/
    	while(p[count] != '\0')
    	{
    		if(p[count] != ',')
    		{ f = my_getnbr(p[count]) ; f *= 10; }
    		count++;
    		countdec++;
    	}
     
    	printf("OK\n");
     
    	result =  f;
    	while(countdec != 0)
    	{
    		result /= 10;
    		countdec--;
    	}
    	result += i;
     
    	return result;
    }
    Voila desoler si je me suis mal exprimer mais please help

    Merci d'avance

  2. #2
    Membre actif
    Homme Profil pro
    Ingénierie des systemes embarqués temps réels
    Inscrit en
    Juin 2006
    Messages
    152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Ingénierie des systemes embarqués temps réels
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2006
    Messages : 152
    Points : 231
    Points
    231
    Par défaut
    premiere remarque

    le prototypage float converttofloat(char *p);

    printf ("%f\n",converttofloat(pointeur));
    Pendant 25 ans j'ai toujours cru que le soleil se levait à l'est et se couchait à l'ouest... 1/4 de siècle à remettre en cause...
    _______________________ ______________
    Systèmes embarqués RT et Informatique Industrielle.
    Conception, intégration électronique et logicielle.
    Développement des drivers ,GUI,et softs pour vos applications.
    _______
    Debian ,CentOS,Suse,Windows(xp pro,7).

  3. #3
    Membre actif
    Homme Profil pro
    Ingénierie des systemes embarqués temps réels
    Inscrit en
    Juin 2006
    Messages
    152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Ingénierie des systemes embarqués temps réels
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2006
    Messages : 152
    Points : 231
    Points
    231
    Par défaut
    P est de type char


    if( (p >= '0') && (p <= '9') ) tu compare p avec le caractere '0' ,'9' ou leur code ascii...
    mon avi est que certainement tu veux que p €[0,9] pour les entiers.
    Pendant 25 ans j'ai toujours cru que le soleil se levait à l'est et se couchait à l'ouest... 1/4 de siècle à remettre en cause...
    _______________________ ______________
    Systèmes embarqués RT et Informatique Industrielle.
    Conception, intégration électronique et logicielle.
    Développement des drivers ,GUI,et softs pour vos applications.
    _______
    Debian ,CentOS,Suse,Windows(xp pro,7).

  4. #4
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par firemax Voir le message
    Mon but est plutot simple , en faite je voudrais coder (ou recoder vu que je ne sais pas si elle existe)<...>
    strtod().
    Pas de Wi-Fi à la maison : CPL

  5. #5
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Citation Envoyé par firemax Voir le message
    return ((int)p - 48);
    pourquoi -48 ? Qu'est ce qui ne va pas avec -'0' ?

    Citation Envoyé par firemax Voir le message
    while((p[count] != ',') || (p[count] != '\0') )
    La condition est toujours vraie, ce n'est pas || mais && qu'il faut utiliser.

    Citation Envoyé par firemax Voir le message
    { i = my_getnbr(p[count]) ; i *= 10; }
    Ici tu n'as que le dernier chiffre (puisque tu n'ajoutes pas les chiffres precedement convertis. En outre les unites deviennes des dizaines. Il ne faut pas multiplier ce que tu viens de convertir mais ce que tu avais deja converti avant de l'ajouter au chiffre courant.

    Citation Envoyé par firemax Voir le message
    { f = my_getnbr(p[count]) ; f *= 10; }
    Meme remarque

    Citation Envoyé par firemax Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    result =  f;
    	while(countdec != 0)
    	{
    		result /= 10;
    		countdec--;
    	}
    	result += i;
    Pourquoi ne pas directement travaille en decimal ?

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 48
    Points : 37
    Points
    37
    Par défaut
    Citation Envoyé par Emmanuel Delahaye Voir le message
    strtod().
    Merci
    Mais vais la recoder quand meme (pour le plaisir ^^)

    Citation Envoyé par gl Voir le message
    pourquoi -48 ? Qu'est ce qui ne va pas avec -'0' ?
    Bah on recupere sous forme de char donc '0' = 48 , '1' = 49 ... Non ?
    Du coup pour le recuperer sous sa forme decimale on lui retire 48 , je me trompe ?

    Citation Envoyé par gl Voir le message
    La condition est toujours vraie, ce n'est pas || mais && qu'il faut utiliser.



    Citation Envoyé par gl Voir le message
    Ici tu n'as que le dernier chiffre (puisque tu n'ajoutes pas les chiffres precedement convertis. En outre les unites deviennes des dizaines. Il ne faut pas multiplier ce que tu viens de convertir mais ce que tu avais deja converti avant de l'ajouter au chiffre courant.
    Ah ouai ^^' la j'ai bugger desole

    Citation Envoyé par gl Voir le message
    Pourquoi ne pas directement travaille en decimal ?
    Comment ?

    Citation Envoyé par bi_turbo Voir le message
    premiere remarque

    le prototypage float converttofloat(char *p);

    printf ("%f\n",converttofloat(pointeur));
    Citation Envoyé par bi_turbo Voir le message
    P est de type char


    if( (p >= '0') && (p <= '9') ) tu compare p avec le caractere '0' ,'9' ou leur code ascii...
    mon avi est que certainement tu veux que p €[0,9] pour les entiers.
    J'ai pas compris ce que tu voulais dire desoler .


    Sinon voici le code actuel apres quelque modification :

    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
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    #include <stdio.h>
     
    float converttofloat(char *p);
    int  my_getnbr(char p);
     
    int main ()
    {
    	/*Essai heroiaue pour faire le triple d'un nombre 
    	a virgule du type 47,87 pour lexemple*/
    	char *pointeur;
     
    	pointeur = "47,87";
    	printf("%s\n",pointeur);
    	printf ("%f\n",converttofloat(pointeur));
    	return 0;
    }
     
    int my_getnbr(char p)
    {
    	if( (p >= '0') && (p <= '9') )
    		return ((int)p - 48);
    	else
    		return (-1);
    }
     
    float converttofloat(char *p)
    {
    	int i=0 ; 
    	int f=0 ; 
    	int count=0;
    	int countdec=0;
    	float result = 0;
     
    	printf("OK\n");
    	/*Recuperation de la partie entiere*/
    	while((p[count] != ',') && (p[count] != '\0') )
    	{
    		if(p[count] != ',')
    		{ i *= 10 ; i += my_getnbr(p[count]) ; }
    		count++;	
    	}
     
    	count++;
    	printf("OK\n");	
     
    	/*Recuperation de la partie decimale*/
    	while(p[count] != '\0')
    	{
    		if(p[count] != ',')
    		{ f *= 10 ; f += my_getnbr(p[count]) ; }
    		count++;
    		countdec++;
    	}
     
    	printf("OK\n");
     
    	result =  f;
    	while(countdec != 0)
    	{
    		result /= 10;
    		countdec--;
    	}
    	result += i;
     
    	return result;
    }

  7. #7
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Citation Envoyé par firemax Voir le message
    Citation Envoyé par gl Voir le message
    pourquoi -48 ? Qu'est ce qui ne va pas avec -'0' ?
    Bah on recupere sous forme de char donc '0' = 48 , '1' = 49 ... Non ?
    Du coup pour le recuperer sous sa forme decimale on lui retire 48 , je me trompe ?
    * Retirer '0' marche tout aussi bien dans ton cas (comme tu l'as dit chez toi '0' = 48).
    * Continue a fonctionner sur les architectures utilisant des charset ou '0' n'est pas egal a 48 (au hasard EBCDIC.
    * Utiliser '0' est largement plus lisible et renseigne bien davantage sur le but du bout de code que d'utiliser 48.


    [QUOTE=firemax;2419679]
    Citation Envoyé par gl Voir le message
    Sinon voici le code actuel apres quelque modification :
    Pose-t-il toujours le meme probleme ?

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 48
    Points : 37
    Points
    37
    Par défaut
    Non il ne pose plus probleme (desoler j'ai oublier de clicker sur resolu)

    Si ce n'est que j'obtiens 47.869999 au lieu de 47,87 mais je vais me debrouiller (enfin j'espere)

    J'ai modifier le code pour - '0' tu as raisons c'est beaucoup plus lisible

    Merci tous le monde

  9. #9
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Citation Envoyé par firemax Voir le message
    Si ce n'est que j'obtiens 47.869999 au lieu de 47,87 mais je vais me debrouiller (enfin j'espere)
    C'est normal, c'est lie a la representation interne des reels.
    La plupart des reels ne peuvent pas etre represente de maniere exacte, le resultat des calculs fournit une approximation.

    Si tu veux gagner en precision, utilises des double plutot que des float.

    Sinon ton code presente encore des imperfections:

    * Pas de gestion des chaines malformatees (presence d'un caractere non numerique)
    * Pas de gestion du signe
    * Mauvaise gestion de l'absence de ','
    * gestion surprenante de la presence de plusieurs ',' dans la chaine

  10. #10
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par firemax Voir le message
    Si ce n'est que j'obtiens 47.869999 au lieu de 47,87
    Utilise "%g" ou "%2g"
    Pas de Wi-Fi à la maison : CPL

  11. #11
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 48
    Points : 37
    Points
    37
    Par défaut
    Merci a vous deux

    Je retravaillerais mon code pour l'ameliorer et je tienderais compte de ces critiques

    Je reposte mon code modifier un peu plus tard

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

Discussions similaires

  1. Conversion string vers float - résultat étrange
    Par polysil dans le forum Langage
    Réponses: 2
    Dernier message: 18/06/2013, 14h59
  2. [C++] conversion classe string vers float
    Par agrosjea dans le forum C++
    Réponses: 5
    Dernier message: 14/03/2007, 13h45
  3. Conversion String vers Byte
    Par zulianithomas dans le forum Delphi
    Réponses: 8
    Dernier message: 07/10/2006, 10h09
  4. conversion string vers int
    Par mathher dans le forum C++
    Réponses: 4
    Dernier message: 14/04/2006, 17h52

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