FONCTION FTOA

Signaler
Messages postés
2671
Date d'inscription
vendredi 25 janvier 2002
Statut
Membre
Dernière intervention
6 février 2013
-
draluorg
Messages postés
627
Date d'inscription
vendredi 23 avril 2004
Statut
Membre
Dernière intervention
25 novembre 2010
-
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
627
Date d'inscription
vendredi 23 avril 2004
Statut
Membre
Dernière intervention
25 novembre 2010

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
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
8
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
627
Date d'inscription
vendredi 23 avril 2004
Statut
Membre
Dernière intervention
25 novembre 2010

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
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
8
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
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
8
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
627
Date d'inscription
vendredi 23 avril 2004
Statut
Membre
Dernière intervention
25 novembre 2010

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
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
8
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
627
Date d'inscription
vendredi 23 avril 2004
Statut
Membre
Dernière intervention
25 novembre 2010

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
Modérateur
Dernière intervention
22 août 2010
7
C'est vrai, on peut pas utiliser les float sans CRT. Pourquoi j'ai fait ca??
racpp
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
8
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
Modérateur
Dernière intervention
22 août 2010
7
le but est entre autre de ne pas obliger l'utilisateur à utiliser la CRT
rrk275
Messages postés
542
Date d'inscription
vendredi 25 juin 2004
Statut
Membre
Dernière intervention
1 octobre 2007
2
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

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
Modérateur
Dernière intervention
22 août 2010
7
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

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

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
1
char* fcvt (double, int, int*, int*);

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