FONCTION FTOA

DeAtHCrAsH Messages postés 2670 Date d'inscription vendredi 25 janvier 2002 Statut Membre Dernière intervention 6 février 2013 - 6 avril 2005 à 12:09
draluorg Messages postés 625 Date d'inscription vendredi 23 avril 2004 Statut Membre Dernière intervention 25 novembre 2010 - 20 févr. 2009 à 22:39
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/30521-fonction-ftoa

draluorg Messages postés 625 Date d'inscription vendredi 23 avril 2004 Statut Membre Dernière intervention 25 novembre 2010
20 févr. 2009 à 22:39
re,

Erf, c'est encore pire que ce que j'avais pensé...
Mais j'ai plus ou moins trouvé

On prend mon petit projet (celui du zip plus haut)
on vire la declare et l'option du compilo, erreur crtMain machin

on active l'option, l'erreur crtmain est corrigee, mais on a l'erreur fltused

on fait un petit #pragma comment(lib, "ntdll.lib")
et hop plus d'erreur!!!
direction sortie asm... que voit on ?
EXTRN __fltused:DWORD

Voilà qui explique le mistére, tu peux toujours essayer sous vs2005 sait-on jamais...

++
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
20 févr. 2009 à 21:21
Salut,
Je viens d'essayer avec VC2005 et ça ne marche pas. Après avoir declaré int _fltused; en global il me sort l'erreur:
error LNK2001: unresolved external symbol __ftol2
L'hypothèse de la nouveauté VC2008 se confirme donc. C'est une bonne nouvelle car cela nous éviterait d'utiliser de l'ASM pour utiliser les float sans CRT. Je vais donc bientôt passer à VC2008.
Vu le grand nombre d'options de compilation et d'édition des liens, on peut parfois se perdre et ne plus savoir ce qu'on fait. C'est ça la programmation avec ses joies et ses frustrations.
Merci encore.
draluorg Messages postés 625 Date d'inscription vendredi 23 avril 2004 Statut Membre Dernière intervention 25 novembre 2010
20 févr. 2009 à 17:06
re,

Pas de quoi, de mon coté je ne m'explique toujours pas pourquoi dans mon autre projet cette option suffit au compilateur.
Je viens encore de verifier, si je desactive cette fonction le projet ne compile plus!
Enfin comme on dit, la theorie c'est quand on connait tout mais que rien ne va, et la pratique c'est quand tout fonctionne et qu'on ne sait pas pourquoi...

++
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
20 févr. 2009 à 01:18
Je n'ai pas pu résister j'ai vu le code. En effet, il n'y a aucune dépendance à la CRT. Le code ASM contient bien les instructions de traitement des floats. Il parait que c'est une nouveauté VC2008 car mon VC2005 n'arrive même pas à ouvrir le projet. Dommage. J'essaierai d'y voir plus clair plus tard.
Merci pour le partage.
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
20 févr. 2009 à 00:57
Remarque: pour pouvoir virer totalement la CRT il faut travailler en C et non en C++.
Merci pour le code je vais le regarder demain.
draluorg Messages postés 625 Date d'inscription vendredi 23 avril 2004 Statut Membre Dernière intervention 25 novembre 2010
19 févr. 2009 à 23:24
Salut Racpp,

Eh en effet cette option est capricieuse je viens de retester sur un new projet et ca me donne la meme erreur :s
Je suis pourtant actuellement encore sur un projet ou cette option suffit...

Enfin bref avec cette declare ça regle le probleme:

#if defined(__cplusplus)
extern "C" {
#endif
int _fltused;
#if defined(__cplusplus)
};
#endif

Voici un ptit projet de test (avec un ftoa), regarde le code assembleur stu veux moi perso j'ai trouvé aucune trace du crt.
http://systemzeb.free.fr/FloatNoCRT.zip

++
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
19 févr. 2009 à 21:15
draluorg >> Es-tu sûr d'avoir totalement viré la CRT? As-tu bien vérifié les dépendances et le code ASM généré?
Je me rappelle bien avoir essayé cette option sous VC2005 mais sans succès. On a toujours le message d'erreur du linker:
error LNK2001: unresolved external symbol __fltused
draluorg Messages postés 625 Date d'inscription vendredi 23 avril 2004 Statut Membre Dernière intervention 25 novembre 2010
16 févr. 2009 à 05:28
Salut à tous,
Ce post date un peu je sais, mais on peut utiliser les float sans crt.
Sous vs2008 suffit d'activer "Omettre les noms de librairie par defaut" (/Zl)

++
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
18 juil. 2008 à 20:24
C'est vrai, on peut pas utiliser les float sans CRT. Pourquoi j'ai fait ca??
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
11 juil. 2008 à 03:33
Salut,
En cherchant un exemple pour une réponse à une question du forum, je suis tombé sur ce code source.
Est-il possible d'utiliser le type float (ou double) sans CRT?
Je n'ai jamais réussi à le faire car le linker n'arrive pas à résoudre le symbole __fltused. Pour contourner le problème, j'évite le type float dans mon code et le remplace par une structure de champs de bits conforme et des fonctions à base d'instructions assembleur du coprocesseur comme fld,fdiv, fmul etc. Ce serait bien pratique de pouvoir utiliser les floats directement sans CRT.
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
7 oct. 2005 à 21:33
le but est entre autre de ne pas obliger l'utilisateur à utiliser la CRT
rrk275 Messages postés 540 Date d'inscription vendredi 25 juin 2004 Statut Membre Dernière intervention 1 octobre 2007 2
5 oct. 2005 à 23:19
pour trouver un fottant à decimales en base 10:
on trouve la partie decimale 0,.... {partflottante = nb - int(nb)}
on a aussi la partie entiere (ex 46568){partentiere = int(nb)}
on multiplie par 10^6 la partie decimal partflottante *10^6= 0......,.....
on fait itoa(partentiere)+"."+"itoa(int(partflottante))"
je sais que tu ne veux pas utiliser itoa et j'avoue ne pas avoir lu le code
mais c'est pas plus simple ???
ctx_man Messages postés 285 Date d'inscription mardi 28 décembre 2004 Statut Membre Dernière intervention 20 janvier 2013 3
11 juin 2005 à 22:06
Je me disais aussi que ce n'etait pas normal que quelqu'un qui fait des code aussi complexe que les tiens ne pense pas a une solution aussi conne que la mienne. Pour une solution plus simple que la tienne et qui n'utilise pas itoa je n'ai vraiment pas le niveau de maths requis, déjà que je ne l'ai pas pour ta solution actuelle...
Bonne continuation
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
11 juin 2005 à 17:37
Pour commencer, j'avais pas envie d'utiliser itoa. Je sais que j'ai mis un petit moment a écrire cette fonction, j'espère que je ne suis passé à coté d'un solution évidente
ctx_man Messages postés 285 Date d'inscription mardi 28 décembre 2004 Statut Membre Dernière intervention 20 janvier 2013 3
11 juin 2005 à 09:00
Bon ben en fait, mathématiquement, c'est pas possible pour moi (en tout cas pas de si bon heure et n'ayant pas dormit...)
Mais j'ai une autre solution :

int valeur = flottant * 10^n //n etant le nombre de chiffre apres
//la virgule que tu souhaite avoir

itoa(je sais plus l'ordre des param ! lol);
mais maintenant tu n'a plus qu'a poser ta virgule sachant que les n derniers caractere de ta chaine sont ceux apres la virgule.
ctx_man Messages postés 285 Date d'inscription mardi 28 décembre 2004 Statut Membre Dernière intervention 20 janvier 2013 3
11 juin 2005 à 08:26
Ne serai-til pas plus simple de calculer l'exposant biaisé (l'orthographe doit pas être bon mais je pense que tu comprend ce dont je parle) puis la partie fractionnaire et faire 2 itoa en mettant une virgule entre les deux ?
cs_magma Messages postés 198 Date d'inscription vendredi 4 avril 2003 Statut Membre Dernière intervention 18 mars 2011
28 mai 2005 à 17:11
char* fcvt (double, int, int*, int*);

(Inclure stdlib.h)
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
6 avril 2005 à 15:08
Ca veut juste dire que l'autre fois elle marchait pas
DeAtHCrAsH Messages postés 2670 Date d'inscription vendredi 25 janvier 2002 Statut Membre Dernière intervention 6 février 2013
6 avril 2005 à 12:09
Vont finir par avoir ta peau ces flottants :-)
sprintf marche quand elle veut ??? c.a.d ?