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 :

[EFL] - Probléme fonction conversion string en double


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de Mika2008
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 176
    Par défaut [EFL] - Probléme fonction conversion string en double
    Bonjour,
    J'essai d'écrire un programme qui utilise la librairies Enlightenment Foundation Libraries (EFL)
    Donc dans mon cas j'utilise la librairie EINA
    et plus particulierrement une fonction de convertion des string en double :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    EAPI Eina_Bool 	eina_convert_atod  (const char *src, int length, long long *m, long *e)
     	Convert a string to a double.

    dont voici un exemple d'utilisation :
    Issue de la doc offiiel :

    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
     #include <stdlib.h>
     #include <stdio.h>
     
     #include <Eina.h>
     
     int main(void)
     {
        char      tmp[128];
        long long int m = 0;
        long int  e = 0;
        double    r;
     
        if (!eina_init())
        {
            printf ("Error during the initialization of eina.\n");
            return EXIT_FAILURE;
        }
     
        eina_convert_dtoa(40.56, tmp);
        printf("value: %s\n", tmp);
     
        eina_convert_atod(tmp, 128, &m, &e);
        r = ldexp((double)m, e);
        printf("value: %s\n", tmp);
     
        eina_shutdown();
     
        return EXIT_SUCCESS;
     }

    et donc voici mon code ou j'utilise cett fonction, en fais je me suis fait une focnction qui me retourne directement un double :
    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
    #include <stdlib.h>
     #include <stdio.h>
    #include <math.h>
     #include <Eina.h>
     
     
     
    double convert_string_double (const char *tmp)
    {
     
        long long int m = 0;
        long int  e = 0;
        double    r;
        //int taille_string = strlen(tmp);
     
        if (!eina_init())
        {
            printf ("Error during the initialization of eina.\n");
            return EXIT_FAILURE;
        }
     
          printf("value string : %s\n", tmp);
     
    	//convert string to double
        if (eina_convert_atod(tmp, 128, &m, &e))
    		    printf("Convertion Sucess \n");
    	else
    			printf("Convertion Ratée \n");
        r = ldexp((double)m, e);
        printf("value double: %f\n", r);
     
        eina_shutdown();
     
    return r;
     
    	}
     
     
     
     
     int main(void)
     {
     
    double r = 0; 
    const char *tmp = "43.5";
     
     
    r = convert_string_double (tmp);
     
    printf("value double = %f\n",r);
     
    return 0;
     }
    et le résultat est le suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    value string : 43.5
    Convertion Ratée 
    value double: 0.000000
    value double = 0.000000
    Donc la convertion est ratée mais jene sais pas pourquoi, je pense peut étre à un probléme de passage entre le char et le char*, qu'en pensez vous svp ?

  2. #2
    Membre confirmé Avatar de Mika2008
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 176
    Par défaut
    en lisant mieux la doc il apparait qu'il faut que mon stricg char soit au format :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    This function converts the 32.32 fixed point number fp to a string. The string is stored in the buffer pointed by des  and must be sufficiently large to contain the converted fixed point number. The returned string is terminated and has the following format:
     
     [-]0xh.hhhhhp[+-]e

    mais je comprend pas l'écriture "[-]0xh.hhhhhp[+-]e" si quelqu'un peut me guider svp?


    merci d'avance

  3. #3
    Membre émérite Avatar de orfix
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 707
    Par défaut
    Peut être que c'est tout simplement la fausse taille que tu fournis ? :
    Code Mika2008 : Sélectionner tout - Visualiser dans une fenêtre à part
    if (eina_convert_atod(tmp, 128, &m, &e))

  4. #4
    Membre confirmé Avatar de Mika2008
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 176
    Par défaut
    ça change rien pour la taille, mais par contre dans la doc il dise :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    This function converts the string s of length length  that represent a double in hexadecimal base to a double. It is used to replace the use of snprintf() with the %a modifier, which is missing on some platform (like Windows (tm) or OpenBSD).
     
    The string must have the following format:
     
     [-]0xh.hhhhhp[+-]e
     
    where the h are the hexadecimal cyphers of the mantiss and e the exponent (a decimal number). If n is the number of cypers after the point, the returned mantiss and exponents are:
     
     mantiss  : [-]hhhhhh
     exponent : 2^([+-]e - 4 * n)
     
    The mantiss and exponent are stored in the buffers pointed respectively by m and e.
    c'est ça en fait que je comprend pas cette histoire de mantiss et d'exponent



    car voila le dernier code,et je ne vois pas pourquoi il ne convertit pas mon string en double :

    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
    67
    68
    69
    70
    71
    72
    73
     
     #include <stdlib.h>
     #include <stdio.h>
     #include <math.h>
     
     #include <Eina.h>
    double convert_string_double (const char *tmp)
    {
     
        long long int m = 0;
        long int  e = 0;
        double    r;
        //int taille_string = strlen(tmp);
     
        if (!eina_init())
        {
            printf ("Error during the initialization of eina.\n");
            return EXIT_FAILURE;
        }
     
          printf("value string : %s\n", tmp);
     
    	//convert string to double
        if (eina_convert_atod(tmp, 128, &m, &e))
    		    printf("Convertion Sucess \n");
    	else
    			printf("Convertion Ratée \n");
        r = ldexp((double)m, e);
        //printf("value double: %f\n", r);
     
        eina_shutdown();
     
    return r;
     
    	}
     
     
     
     
     
     int main(void)
     {
     
     
     
     
     
        //const char     tmp[128]= "6.8";
        const char     tmp[128]= "0x2.453cd3+2";
     
        double    r;
     
         //snprintf(tmp, sizeof(tmp),"%a",tmp);
     
     
        if (!eina_init())
        {
            printf ("Error during the initialization of eina.\n");
            return EXIT_FAILURE;
        }
     
     
     
     
     
    r = convert_string_double (tmp);
     
    printf("value double = %f\n",r);
     
        eina_shutdown();
     
        return EXIT_SUCCESS;
     }

  5. #5
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    J'ai pas tout lu en détail, mais dans l'exemple tmp est dimensionné à 128 caractères, dans votre essai à 4 caractères.
    Si vous passez un paramètre en const, il ne sera pas modifié.
    Je regarderai ça mieux demain.
    Bonsoir.

  6. #6
    Invité
    Invité(e)
    Par défaut
    Bon,
    Le fonction ...atod converti une chaine en double.
    La place à réserver pour la chaine est au maximum de 128 caractères, y compris le 0 terminal.
    Les valeurs acceptées doivent être de la forme
    [-]0xh.hhhhhp[+-]e
    c'est à dire
    1- un signe moins optionnel
    2- des chiffres hexa avant le point décimal
    3- un point décimal
    4- 5 chiffres hexa après le point décimal
    5- moi, j'aurais écrit e[+-]p, mais leur écriture est conventionnelle (e == 14)

    La particularité est que la valeur attendue est de l'hexadécimal.
    C'est à dire que si tmp contient A.0 le double renvoyé est 10.00000.
    Si vous voulez transformer une valeur caractère représentant un double (par exemple 1256.25, pour un montant en €, en base décimale), il suffit de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    char *tmp[16];
    strcpy(tmp,"1256.25");
    double Val;
    sscanf(tmp,"%0.2lf",&Val);  // entre le 2 et le f, c'est la lettre L minuscule
    Sauf si j'ai rien compris, mais il suffit de faire des essais.

Discussions similaires

  1. Problème de conversion String en Double
    Par eighty_three dans le forum Langage
    Réponses: 7
    Dernier message: 19/06/2008, 09h41
  2. Problème de conversion String en Float avec JTable
    Par dumasan dans le forum Composants
    Réponses: 4
    Dernier message: 23/04/2007, 11h56
  3. conversion string en double
    Par kakrocq dans le forum C++/CLI
    Réponses: 4
    Dernier message: 11/04/2007, 13h54
  4. Problème de conversion string->int
    Par seheiahs dans le forum Langage
    Réponses: 4
    Dernier message: 28/06/2006, 10h42
  5. conversion string en double
    Par zmatz dans le forum SL & STL
    Réponses: 2
    Dernier message: 14/10/2005, 22h46

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