Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 03/11/2008, à 17:16

dawadoc

[STL] disparition de "strtof" ??

Salut amis ubunteros smile

Je fais face à un problème qui me laisse perplexe suite au passage du hardi à l'intrépide. Je m'explique:

Depuis l'upgrade, je rencontre des soucis avec la STL. Lorsque j'essaie de compiler un code faisant appel à la fonction strtof() ou ces équivalents pour les entier ou les doubles, la compilation échoue car:

test.cpp:6: erreur: ‘strtof’ was not declared in this scope

Voilà le code que j'ai utilisé pour produire cette erreur:

#include <iostream>
#include <string>

int main(int argc, char *argv[])
{
   std::cout << strtof( "23.56" , 0 ) << std::endl ;
   return 0;
}

Oui mais voilà, et c'est ce qui m'interpelle, je n'ai pas cette erreur pour tous les codes. Certains codes compilent sans problème sur cette même machine.
N'ayant pas ce problème sur ma machine de travail, dont la migration n'est pas faite, je me demande si le problème ne viens pas de l'upgrade ... hmm

Est ce que vous avez rencontré ce genre de soucis ?
Si vous avez des idées sur l'origine ou la solution à ce problème, je suis bien évidemment preneur smile

Bonne soirée.


dawadoc@jabber.ubuntu-fr.org

Hors ligne

#2 Le 03/11/2008, à 19:44

Link31

Re : [STL] disparition de "strtof" ??

C'est quoi cette fonction ? Le C++ n'est pas le C99.
Tu voulais dire std::strtod() ? C'est dans <cstdlib> (qui ne fait pas partie de la STL mais de la SL, au passage).

Mais la bonne solution serait plutôt d'utiliser la STL :

#include <iostream>
#include <sstream>
#include <stdexcept>

float my_strtof(const char* src)
{
	float result;
	std::stringstream ss;
	if (!(ss << src && (ss >> result).eof()))
		throw std::invalid_argument("conversion error");
	return result;
}

int main()
{
	std::cout << my_strtof("23.56") << std::endl;
}

Dernière modification par Link31 (Le 03/11/2008, à 19:45)

Hors ligne

#3 Le 04/11/2008, à 09:23

dawadoc

Re : [STL] disparition de "strtof" ??

Merci pour tes précisions, j'apprends au fur et à mesure de mes besoins smile

Ce que je ne comprend pas dans cette histoire, c'est que je fait comme çà depuis le début, et ca à toujours marcher. Qui plus est, c'est utilisé aussi dans des lib dispo sur le net.

http://www.gpstk.org/doxygen/StringUtils_8hpp-source.html

mais depuis l'update, impossible de compiler ce qui compilat sans pb avant :-/


dawadoc@jabber.ubuntu-fr.org

Hors ligne

#4 Le 04/11/2008, à 13:54

Link31

Re : [STL] disparition de "strtof" ??

Je ne vois pas de strtof() là dedans. Il y a des appels à strtod(), qui est bien dans la bibliothèque standard du C++ (qui contient celle du C89). Mais strtof() fait partie du C99, et n'est donc pas disponible en C++.

Hors ligne

#5 Le 06/11/2008, à 11:08

dawadoc

Re : [STL] disparition de "strtof" ??

Effectivement, il n'y a pas strtof() dans ce code. Pour illustrer un peu plus mon problème, voilà le résultât d'un make sur la GPStk.

In file included from CommonTime.hpp:30,
                 from TimeTag.hpp:30,
                 from ANSITime.hpp:30,
                 from ANSITime.cpp:27:
Exception.hpp: In member function ‘void gpstk::Exception::terminate()’:
Exception.hpp:202: erreur: ‘exit’ was not declared in this scope
In file included from TimeTag.hpp:31,
                 from ANSITime.hpp:30,
                 from ANSITime.cpp:27:
StringUtils.hpp: In function ‘double gpstk::StringUtils::asDouble(const std::string&)’:
StringUtils.hpp:724: erreur: ‘strtod’ was not declared in this scope
StringUtils.hpp: In function ‘long int gpstk::StringUtils::asInt(const std::string&)’:
StringUtils.hpp:732: erreur: ‘strtol’ was not declared in this scope
StringUtils.hpp: In function ‘long unsigned int gpstk::StringUtils::asUnsigned(const std::string&)’:
StringUtils.hpp:740: erreur: ‘strtoul’ was not declared in this scope
make[1]: *** [ANSITime.lo] Erreur 1
make[1]: quittant le répertoire « ~/gpstk1.5/src »
make: *** [all-recursive] Erreur 1

Comme tu peut le voir, il me dit qu'il ne connais pas les fonctions. Alors que dans un autre code, ces fonctions sont utilisées et ca compile. hmm
Si tu as une idée, je suis preneur.


dawadoc@jabber.ubuntu-fr.org

Hors ligne

#6 Le 06/11/2008, à 11:13

Link31

Re : [STL] disparition de "strtof" ??

Vérifie que <cstdlib> est inclus, et rajoute std:: avant les appels aux fonctions de cstdlib (std::exit(), std::strtod()...).

Tu peux inclure <stdlib.h> pour ne pas avoir à rajouter le namespace, mais c'est mieux d'utiliser les namespaces C++.

Hors ligne