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 :

Utiliser Boost ou FMT


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2018
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mars 2018
    Messages : 6
    Par défaut Utiliser Boost ou FMT
    Bonjour à tous,

    Je travaille actuellement sur un projet comprenant un Reach de chez Emlid. Cet appareil tourne sur une version allégée de Linux (Linux reach 3.10.98-poky-edison+) et permet principalement d'obtenir les données d'un GPS mais également des données d'un accéléromètre. Et c'est sur cette dernière partie que je bloque. J'arrive bien a effectuer la prise de mesure cependant il faut enregistrer toutes les données dans un fichier. Donc je pars sur la librairie BOOST pour enregistrer des données en affichant le signe et en modifiant la précision du float comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    string toWrite = boost::str(boost::format("Gyr: %+8.3f %+8.3f %+8.3f\t") % gx % gy % gz);
    et j'écrirai cette variable plus tard dans un fichier. Mais je n'ai pas accès à la librairie BOOST ni à la librairie FMT pour faire cette action (la distribution est trop fermée...). Avez-vous une solution pour contourner ce problème ?

    Merci d'avance.

    Kevin

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    Billets dans le blog
    4
    Par défaut
    Et qu'est-ce qui t'empêche de télécharger Boost ou FMT ?
    Sinon, rien qui ne puisse être fait avec la std, donc embarquer Boost ou FMT juste pour ça.. bof bof
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    Membre Expert
    Avatar de Pyramidev
    Homme Profil pro
    Tech Lead
    Inscrit en
    Avril 2016
    Messages
    1 513
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Tech Lead

    Informations forums :
    Inscription : Avril 2016
    Messages : 1 513
    Par défaut
    Bonjour,

    Voici un petit bout de code qui utilise std::snprintf :
    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
    #include <cstdio>
    #include <iostream>
    #include <stdexcept>
     
    template<class... Param>
    std::string formatStdString(char const* format, Param... params) {
    	constexpr size_t bufferSize = 1024;
    	char buffer[bufferSize];
    	int const snprintfResult = std::snprintf(buffer, bufferSize, format, params...);
    	if(snprintfResult < 0)
    		throw std::runtime_error("formatStdString : error code " + std::to_string(snprintfResult) + ".");
    	if(snprintfResult >= bufferSize)
    		throw std::runtime_error("formatStdString : the buffer is not big enough.");
    	return std::string{buffer};
    }
     
    int main() {
    	double const gx = 1234.56789;
    	double const gy = 0.0456789;
    	double const gz = 78.9;
    	std::cout << formatStdString("Gyr: %+8.3f %+8.3f %+8.3f\t", gx, gy, gz);
    	return 0;
    }

  4. #4
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Citation Envoyé par k.bertrand Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    string toWrite = boost::str(boost::format("Gyr: %+8.3f %+8.3f %+8.3f\t") % gx % gy % gz);
    En C++ standard avec les flux, ça doit être équivalent à (non testé, mais c'est l'idée):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    std::stringstream oss;
    oss << "Gyr: " << setprecision(3) << setw(8) << gx << setw(8) << gy << setw(8) << gz;
    auto toWrite = oss.str();
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  5. #5
    Membre Expert
    Avatar de Pyramidev
    Homme Profil pro
    Tech Lead
    Inscrit en
    Avril 2016
    Messages
    1 513
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Tech Lead

    Informations forums :
    Inscription : Avril 2016
    Messages : 1 513
    Par défaut
    Citation Envoyé par JolyLoic Voir le message
    En C++ standard avec les flux, ça doit être équivalent à (non testé, mais c'est l'idée):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    std::stringstream oss;
    oss << "Gyr: " << setprecision(3) << setw(8) << gx << setw(8) << gy << setw(8) << gz;
    auto toWrite = oss.str();
    J'avais testé ça en premier, mais ce n'est pas équivalent. Par exemple, cela affiche 1.23e+03 et 78.9 au lieu de +1234.568 et +78.900 (testé avec GCC 8.1.0).

  6. #6
    Membre chevronné
    Avatar de Garvelienn
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2016
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Septembre 2016
    Messages : 244
    Par défaut
    Si je ne me trompe pas, vous pouvez utiliser la fonction std::fixed, telle que :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    std::stringstream oss;
    oss << "Gyr: " << std::fixed << setprecision(3) << setw(8) << gx << setw(8) << gy << setw(8) << gz;
    auto toWrite = oss.str();
    Si je traduis très grossièrement la documentation :
    Cela permet de fixer le floatfield. La nombre est affiché avec autant de chiffres après la virgule que spécifiés par la variable "precision" et ce, avec aucun affichage d'exposant. (Je n'ai pas vérifié pour ce dernier point)

    Par contre, je n'ai jamais eu à afficher le signe du nombre donc je ne sais pas

  7. #7
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    Billets dans le blog
    4
    Par défaut
    std::showpos
    Perso j'utiliserais sprintf, ça reste la syntaxe la plus digeste imo. La syntaxe à sortir en C++ pour avoir l'équivalent est vraiment imbuvable.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

Discussions similaires

  1. Problèmes avec des librairies (.a et .so)
    Par André K dans le forum C
    Réponses: 2
    Dernier message: 23/10/2006, 15h58
  2. Problème avec la librairie POI
    Par clement42 dans le forum Documents
    Réponses: 3
    Dernier message: 18/11/2005, 19h11
  3. [GD] Problème avec la librairie GD et les header !!
    Par jesspepette dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 15/10/2005, 12h09
  4. Problème avec la librairie rfunc sous Firebird
    Par yayelix dans le forum SQL
    Réponses: 4
    Dernier message: 17/05/2005, 16h49
  5. Problème avec les librairies ZLIB et LIBPNG
    Par VenusX117 dans le forum Bibliothèques
    Réponses: 1
    Dernier message: 14/03/2005, 14h49

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