Accueil Ti-Gen Foire Aux Questions Chat sur le chan #tigcc sur IRC
Liste des membres Rechercher Aide
Bienvenue Invité !   Se connecter             Mes sujets   
Administrer
0 membre(s) et 1 visiteur(s) actif(s) durant les 5 dernières minutes Utilisateurs actifs : Aucun membre + 1 visiteur
Avant de poster sur le forum, il y a des régles de bases à respecter pour une bonne entente et un respect de tous.
Veuillez lire la charte du forum.
  :: Index » Forum Ti68K » Programmation C » [solve] atof.........=°#[-"# !!!!! (14 réponse(s))
./POST DE DEPART (post n°0)   Marquer comme non lu.
barraq Ecrit le: Mardi 19 juillet 2005 à 14:03 Déconnecté(e)    Voir le profil de barraq Envoyer un email à barraq Visiter le site WEB de barraq Envoyer un message privé à barraq  

Bonjour,

Voila un ti bout de code :

// Main Function
void _main(void)
{
char buffer[50];
clrscr ();
printf("%.2f\n",atof(gets(buffer)));
ngetchx ();
}

Bon, je rentre : 12.34
et voila le résultat : 0e-11724

Je n'arrive pas du tout trouver la valeur d'un float venant d'un string...
encore une erreur bête mais la quelle...

Merci aux grands qui répondent :D

-Edité le Mardi 19 juillet 2005 à 15:18 par barraq-
Ne perdez pas votre vie a la gagner !
    
./Post n°1   Marquer comme non lu.
RHJPP Ecrit le: Mardi 19 juillet 2005 à 14:33 Déconnecté(e)    Voir le profil de RHJPP Envoyer un email à RHJPP Envoyer un message privé à RHJPP  


En général j?utilise sscanf.
    
./Post n°2   Marquer comme non lu.
barraq Ecrit le: Mardi 19 juillet 2005 à 14:36 Déconnecté(e)    Voir le profil de barraq Envoyer un email à barraq Visiter le site WEB de barraq Envoyer un message privé à barraq  

tu aurais un exemple de code tien pour remplacer le mien avec sscanf
(mon probleme étant bien entandu la conversion de string > float ET PAS l'affichage !! )
Merci....
-Edité le Mardi 19 juillet 2005 à 14:38 par barraq-
Ne perdez pas votre vie a la gagner !
    
./Post n°3   Marquer comme non lu.
RHJPP Ecrit le: Mardi 19 juillet 2005 à 14:42 Déconnecté(e)    Voir le profil de RHJPP Envoyer un email à RHJPP Envoyer un message privé à RHJPP  


Voilà :
void _main(void)
{
  char buffer[50];
  float f;
  clrscr ();
  scanf("%49s",buffer);
  sscanf(buffer,"%f",&f);
  printf("\n%f\n",f);
  ngetchx ();
}
    
./Post n°4   Marquer comme non lu.
barraq Ecrit le: Mardi 19 juillet 2005 à 15:00 Déconnecté(e)    Voir le profil de barraq Envoyer un email à barraq Visiter le site WEB de barraq Envoyer un message privé à barraq  

Ok, code corrigé :

// Fonction de TIGCC : InputStr
void InputStr(char *buffer, unsigned short maxlen)
{
SCR_STATE ss;
short key;
unsigned short i = 0;
buffer[0] = 0;
SaveScrState (&ss);
SetAlphaStatus(FALSE);

do
{
MoveTo (ss.CurX, ss.CurY);
printf ("%s_ ", buffer);
// Note that two spaces are required only if the F_4x6 font is used
key = ngetchx ();
if (key >= ' ' && key <= '~' && i < maxlen)
buffer[i++] = key;
else if (key == KEY_BACKSPACE && i)
i--;

buffer[i] = 0;
} while (key != KEY_ENTER);
}

// Main Function
void _main(void)
{
char s[20];
float f;
clrscr ();
InputStr (s, 20);
printf ("\nNormal value : %s\n", s);
sscanf(s,"%f",&f);
printf("\nAtof value : %.2f\n",f);
ngetchx ();
}

Merci bcp ! je me souvenais plus de sscanf....




Donc voici une fonction atof qui marche :

float atof(char *stringtofloat)
{
float f;
sscanf(stringtofloat,"%f",&f);
return f;
}

ou avec precision

float atof(char *stringtofloat, int prec)
{
float f;
char buffer[50];
sprintf(buffer,"%c.%d%c",'%',prec,'f');
sscanf(stringtofloat,buffer,&f);
return f;
}
-Edité le Mardi 19 juillet 2005 à 15:18 par barraq-

[EDIT par Kevin Kofler: Problème tag [i].]
-Edité le Mercredi 20 juillet 2005 à 07:22 par Kevin Kofler-
Ne perdez pas votre vie a la gagner !
    
./Post n°5   Marquer comme non lu.
Link Ecrit le: Mardi 19 juillet 2005 à 15:20 Déconnecté(e)    Voir le profil de Link Envoyer un email à Link Visiter le site WEB de Link Envoyer un message privé à Link  

finalement, le sscanf() et le atof(), ils renvoient la même valeur ou deux valeurs différentes, si tu leur passes en argument la même chaîne?
Ce serait intéressant à vérifier...
    
./Post n°6   Marquer comme non lu.
barraq Ecrit le: Mardi 19 juillet 2005 à 16:13 Déconnecté(e)    Voir le profil de barraq Envoyer un email à barraq Visiter le site WEB de barraq Envoyer un message privé à barraq  

Ben en fait le atof de TIGCC il bug, il renvoie des trucs vraiment bizard, a moin que sa soit moi qui trip.....mais pour le moment j'arrive pas a le faire marcher.

Mais les deux fonctions "atof" que j'ai écrit si dessu renvoie les bonnes valeures :D, elles marchent avec sscanf :D

Si qqun fait marcher le "vrai" atof qu'il le dise et donne un example...
merci :)

(j'ais répondu a ta question ? )
Ne perdez pas votre vie a la gagner !
    
./Post n°7   Marquer comme non lu.
Lionel Debroux Ecrit le: Mardi 19 juillet 2005 à 16:56 Déconnecté(e)    Voir le profil de Lionel Debroux Envoyer un email à Lionel Debroux Visiter le site WEB de Lionel Debroux Envoyer un message privé à Lionel Debroux  

Les *scanf étant lourdes, pour le programme final, tu ferais mieux d'utiliser atof...

Tous les AMS contiennent strtod, y compris les AMS 1.xx. Simplement, l'utilisation de strtod passe par des hacks qui, quoique parfaitement sûrs puisque nécessaires uniquement sur des versions d'AMS qui n'évoluent plus, n'ont jamais été écrits en vrai, même si leur version texte brut existe quelque part dans des fichiers et mails...
Lionel Debroux - membre de TICT.
    
./Post n°8   Marquer comme non lu.
barraq Ecrit le: Mardi 19 juillet 2005 à 17:51 Déconnecté(e)    Voir le profil de barraq Envoyer un email à barraq Visiter le site WEB de barraq Envoyer un message privé à barraq  

tu ferais mieux d'utiliser atof...

Oui mais le problem du topic justment c'est que atof y marche pas, et que aussi strtod exist bien en C mais pas dans la doc de tigcc donc je pense pas pouvoir l'utiliser....

Donc... faut faire comment, donne un exemple stplé :D
Ne perdez pas votre vie a la gagner !
    
./Post n°9   Marquer comme non lu.
Kevin Kofler Ecrit le: Mercredi 20 juillet 2005 à 07:28 Déconnecté(e)    Voir le profil de Kevin Kofler Envoyer un email à Kevin Kofler Visiter le site WEB de Kevin Kofler Envoyer un message privé à Kevin Kofler  


  • Ton atof ne renvoit pas la bonne valeur parce qu'il n'est pas déclaré correctement (les warnings implicit declaration of "atof", c'est pour les chiens? Si tu as un tel warning, ça veut automatiquement dire que ton programme est bogué.) et il n'est pas déclaré correctement parce que tu n'as pas passé le bon MIN_AMS, il faut AMS 1.01 minimum, donc si "Minimum AMS version" est réglé à 1.00 dans les options du projet, ce n'est pas bon, mets-le à 1.01 au moins.
  • scanf, sscanf etc. sont de très mauvaises fonctions à utiliser sur TI, ça prend une place énorme, utilisez plutôt atof!
  • gets est une fonction à proscrire, cette fonction est un bogue! Tout usage de gets est automatiquement un bogue de débordement de buffer. Utilisez getsn à la place.
  • La fonction InputStr dans ton exemple est une réimplémentation incomplète (pas de menu CHAR) et moins optimisée (en C alors que getsn est en assembleur) de getsn.


Bref, pour conclure, tous les exemples qui ont été postés sont mauvais. Le bon code est:
#if MIN_AMS<101
#error MIN_AMS mal réglé (cf. options du projet)!
#endif

// Main Function
void _main(void)
{
char buffer[50];
clrscr ();
printf("%.2f\n",atof(getsn(buffer,50)));
ngetchx ();
}

-Edité le Mercredi 20 juillet 2005 à 07:30 par Kevin Kofler-
Membre de l'équipe de TIGCC: http://tigcc.ticalc.org
Mainteneur du portage Linux/Unix de TIGCC: http://tigcc.ticalc.org/linux/
Membre de l'équipe de CalcForge: http://www.calcforge.org:70/

Participez à la reprise de Ti-Gen!
    
./Post n°10   Marquer comme non lu.
FpgForce Ecrit le: Mercredi 20 juillet 2005 à 09:08 Déconnecté(e)    Voir le profil de FpgForce Envoyer un email à FpgForce Envoyer un message privé à FpgForce  

Sinon on peut utiliser l'estack et estack_to_float :D
(mais la fonction n'est pas documentée :p )

ça donnerait (pas testé):
push_parse_text (buffer) ;
push_simplify (top_estack) ;
printf("%.2f\n", estack_to_float (top_estack)) ;


Mais sachant que atof se sert de push_pars_text, je sais pas si c'est pas equivalent...
    
./Post n°11   Marquer comme non lu.
Kevin Kofler Ecrit le: Mercredi 20 juillet 2005 à 10:21 Déconnecté(e)    Voir le profil de Kevin Kofler Envoyer un email à Kevin Kofler Visiter le site WEB de Kevin Kofler Envoyer un message privé à Kevin Kofler  


atof utilise estack_number_to_Float. Avec ça, pas besoin de push_simplify (qui de plus est la mauvaise fonction à utiliser, tu devrais utiliser NG_approxESI).
Membre de l'équipe de TIGCC: http://tigcc.ticalc.org
Mainteneur du portage Linux/Unix de TIGCC: http://tigcc.ticalc.org/linux/
Membre de l'équipe de CalcForge: http://www.calcforge.org:70/

Participez à la reprise de Ti-Gen!
    
./Post n°12   Marquer comme non lu.
barraq Ecrit le: Mercredi 20 juillet 2005 à 13:58 Déconnecté(e)    Voir le profil de barraq Envoyer un email à barraq Visiter le site WEB de barraq Envoyer un message privé à barraq  

Oula ben voila une réponse complete ! merci beaucoup.
Bon ben TOUT est de MA FAUTE alors, je savais pas que sa changé qqchose le ASM 1.01, donc je corrige cela, merci.

Pour le getc oui je n'utilise jamais cela, mais la c'été juste pour l'exemple, sinon j'utilise une fonction basé sur InputStr car au moin je peut controller la taille des caractéres, alors que avec getsn je pense l'on ne peut pas faire se que l'on veut au niveau graphic.
En fait j'utilise le Ti-titanium pour une application embarquée, et donc les dialogs de la Ti sont écris trop petit, donc je refait tout....c'est pour cela, non je pense que c'est la seul idée.

En tout les cas merci a vous !!!!!
Ne perdez pas votre vie a la gagner !
    
./Post n°13   Marquer comme non lu.
Kevin Kofler Ecrit le: Mercredi 20 juillet 2005 à 14:07 Déconnecté(e)    Voir le profil de Kevin Kofler Envoyer un email à Kevin Kofler Visiter le site WEB de Kevin Kofler Envoyer un message privé à Kevin Kofler  


barraq :
Pour le getc oui je n'utilise jamais cela, mais la c'été juste pour l'exemple, sinon j'utilise une fonction basé sur InputStr car au moin je peut controller la taille des caractéres, alors que avec getsn je pense l'on ne peut pas faire se que l'on veut au niveau graphic.

Si, tu peux utiliser FontSetSys avec getsn sans problèmes, c'est fait pour.

En fait j'utilise le Ti-titanium pour une application embarquée, et donc les dialogs de la Ti sont écris trop petit, donc je refait tout....

Bah, ils sont écrits petit parce que l'écran est petit. Ce n'est pas une raison de tout refaire.
Membre de l'équipe de TIGCC: http://tigcc.ticalc.org
Mainteneur du portage Linux/Unix de TIGCC: http://tigcc.ticalc.org/linux/
Membre de l'équipe de CalcForge: http://www.calcforge.org:70/

Participez à la reprise de Ti-Gen!
    
./Post n°14   Marquer comme non lu.
barraq Ecrit le: Mercredi 20 juillet 2005 à 14:59 Déconnecté(e)    Voir le profil de barraq Envoyer un email à barraq Visiter le site WEB de barraq Envoyer un message privé à barraq  

Bah, ils sont écrits petit parce que l'écran est petit. Ce n'est pas une raison de tout refaire.

Ben si car la calculette va etre utilisé en exterieur pour faire pas mal de calcul sur le terrain, tout doit etre bien visible !!! donc il faut que je face des menus claire, gros et simple.

Voila, mais ce n'est pas bien dure quand meme...
Merci a tous pour vos réponses, ce forum est vraiment super !!!
-Edité le Mercredi 20 juillet 2005 à 15:43 par barraq-
Ne perdez pas votre vie a la gagner !
    
  :: Index » Forum Ti68K » Programmation C » [solve] atof.........=°#[-"# !!!!! (14 réponse(s))
Pages : 1/1     « [1] » »|

.Répondre à ce sujet
Les boutons de code
[B]old[I]talic[U]nderline[S]trikethrough[L]ine Flip Hori[Z]ontallyFlip [V]erticallySha[D]ow[G]low[S]poilerCode [G][C]ite
Bullet [L]istList Item [K] Link [H][E]mail[P]icture SmileysHelp
Couleurs :
Saisissez votre message
Activer les smileys
     

Forum de Ti-Gen v3.0 Copyright ©2004 by Geoffrey ANNEHEIM
Webmaster: Kevin KOFLER, Content Admins: list, Server Admins: Tyler CASSIDY and Kevin KOFLER, DNS Admin: squalyl
Page générée en 61.26ms avec 18 requetes