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

Langage C++ Discussion :

[Arduino]Formatage d'un entier paramétrable


Sujet :

Langage C++

  1. #1
    Membre éprouvé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 022
    Points : 1 049
    Points
    1 049
    Par défaut [Arduino]Formatage d'un entier paramétrable
    Bonjour à toutes et à tous,

    Dans une méthode, je souhaite pouvoir formater un entier avec un nombre de zéros différents selon le cas. Le code est le suivant pour 3 chiffres:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    String aff(int x, char n) {
      char str[16];
      sprintf(str, "%03d", x);
      return str;
    }
    Je souhaite pouvoir remplacer le "%03d" par quelque chose qui intègre le paramètre n (qui, par ailleurs pourrait être un entier, un String, si cela simplifie les choses).

    J'ai essayé différentes choses qui m'ont toutes données des erreurs de compilation. J'avoue que la manipulation des char n'est pas ma tasse de thé.

    Merci d'avance pour votre aide.

    Pierre

  2. #2
    Rédacteur/Modérateur


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

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Je souhaite pouvoir remplacer le "%03d" par quelque chose qui intègre le paramètre n
    J'ai pas compris ta question mais en C++ on utilise des stream et en particulier std::ostringstream::operator<< pour le formatage.
    Tu veux dire que le n définit le nombre de 0 à mettre devant ? std::width et std::fill.
    La syntaxe printf équivalente serait sprintf(str, "%0*d, width, nb) je crois.

    Et sinon lire les cours et tutoriels pour apprendre Arduino
    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 éprouvé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 022
    Points : 1 049
    Points
    1 049
    Par défaut Merci "bousk" pour cette réponse
    Merci "Bousk" pour cette réponse.

    J'aurais dû préciser que je travaille dans l'environnement Arduino et que le bibliothèque std:: n'y existe pas.

    J'ai essayé sprintf(str, "%0*d", width, nb) et sprintf(str, "%*d, width, nb) : cela me sort une ligne blanche.

    Ce que j'aurais voulu faire est de remplacer "%03d" dans sprintf par : sprintf(str, monFormat, ma variable);

    où monFormat est une expression qui peut prendre plusieurs valeurs. Par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    String aff(int x, String n) {
      char str[16];
      String monFormat = "%0"+n+"d";
      sprintf(str, monFormat , x);
      return str;
    }
    Mais ça, ça donne une erreur de compilation. C'est là où je ne sais pas bien appréhender les String, les char, les Tableaux de char, les pointeurs sur .... Autrement dit, quelle forme doit prendre "monFormat" pour qu'il puisse être accepté par la méthode sprintf.

    Merci de votre aide.

    Pierre

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Au pire, tu dois pouvoir faire un truc de ce genre:
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    String aff(int x, int nDigits) {
    	char monFormat[16];
    	char str[16];
    	sprintf(monFormat, "%%0%dd", nDigits);
    	sprintf(str, monFormat , x);
    	return String(str);
    }
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Membre éprouvé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 022
    Points : 1 049
    Points
    1 049
    Par défaut
    Merci "Médinoc" pour cette solution, c'est sioux.

    Je l'avais résolu d'une autre manière :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    String aff(int x, char n) {
      char str[20];
      char monFormat[8];
      String tmp = "%03d";
      strcpy(monFormat, tmp.c_str());
      frmt[2] = n; // remplacement de 3 par n
      sprintf(str, monFormat, x);
      return str;
    }
    L'avantage de ta solution est que je peux mettre plusieurs chiffres à la valeur n. Mais je n'en demande pas tant.

    Cordialement.

    Pierre

  6. #6
    Rédacteur/Modérateur


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

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Testé à l'instant sous VS2013 et VS2015
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    char toto[32] = {0};
    	sprintf(toto, "%0*d", 5, 10);
    	std::cout << toto << std::endl;
    Donc ma syntaxe est bonne, et c'est confirmé partout sur internet.
    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.

  7. #7
    Membre éprouvé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 022
    Points : 1 049
    Points
    1 049
    Par défaut
    Je n'ai jamais dit que la syntaxe que tu m'as proposée était mauvaise. J'ai simplement dit que, dans l'environnement Arduino, qui assez spécial (bibliothèques minimales car doit fonctionner avec des micro-contrôleurs à mémoire limitée), cela me produisait une ligne vide. Donc, dans ce cas, il me fallait une autre méthode.

    Cordialement.

    Pierre

Discussions similaires

  1. Réponses: 7
    Dernier message: 02/02/2016, 16h06
  2. Formatage d'un entier avec des 0 en tête
    Par AODRENN dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 14/06/2007, 19h31
  3. Formatage d'un entier avec des 0 en tête
    Par AODRENN dans le forum Delphi
    Réponses: 7
    Dernier message: 13/06/2007, 17h13
  4. [SQLExpress] Formatage d'un entier en varchar
    Par slopera dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 10/01/2006, 18h01
  5. Réponses: 6
    Dernier message: 23/05/2005, 10h47

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