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

Arduino Discussion :

Récupération de données formatées [Arduino ESP32]


Sujet :

Arduino

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    bricoleur
    Inscrit en
    Octobre 2014
    Messages
    406
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : bricoleur
    Secteur : Alimentation

    Informations forums :
    Inscription : Octobre 2014
    Messages : 406
    Par défaut Récupération de données formatées
    Bonjour à tous.
    Ma question relève plus du langage C que de l'Arduino proprement dit, mais comme je sais que beaucoup d'entre-vous connaissent bien le sujet C, je me permets de poser mon problème ici.
    J'ai une routine:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void gestionCommandes(char *com){
    com est un tabeau de caractères qui peut varié par exemple de "70201" à "70209999".
    Mais je dois stocker dans un fichier séquentiel les caractères 8 à 8.
    J'utilise les 4 premiers caractères puis j'ai besoin de 4 caractères à la fin pour avoir par exemple 70200001, 70200025, 70200845, ou 70209999.
    Pour récupérer 4 caractères à la fin, j'ai fait ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
            char buf1[5], buf0[10];
            memcpy(buf1,com+4,4);
            buf1[4]='\0';
            int valeur = atoi(buf1);
            sprintf(buf0,"%04d",valeur);
    N'y a-t'il pas une meilleure solution?

  2. #2
    Membre Expert Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    784
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 784
    Par défaut
    Hello,

    Ta demande n'est pas vraiment claire. Tu veux mettre les 4 premiers caractères de com dans buf ?

    Si tu es certain que com aura au moins 4 caractères, alors ce
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char buf[10]=0;
    memcpy(buf, com, 4);
    suffit.

    Edit: orthographe

  3. #3
    Membre éclairé
    Homme Profil pro
    bricoleur
    Inscrit en
    Octobre 2014
    Messages
    406
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : bricoleur
    Secteur : Alimentation

    Informations forums :
    Inscription : Octobre 2014
    Messages : 406
    Par défaut
    Désolé si ma demande n'est pas très claire.
    En fait com peut avoir de 5 à 8 caractères: xxxx1 à xxxx9999
    La fin de com est la quantité qu'il me faut récupérer, mais comme elle doit être sur 4 caractères, il me faut ajouter les zéros non significatifs devant: de 0001 à 9999.
    C'est pourquoi j'ai pensé au formatage "%04d" dans sprintf.
    Ma question était simplement, n'y a-t'il pas un moyen plus simple que ce que j'ai fait.
    Merci

  4. #4
    Membre Expert

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2013
    Messages
    1 632
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2013
    Messages : 1 632
    Par défaut
    Bonjour,

    Peut être ceci fera l'affaire. On évite juste une double conversion str -> int -> str.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
       char *s0 = "0000";
       int  len = strlen(s);
       if len < 4 then return;
       strnins(s+4, s0, 8-len);
    Il faut remarquer que "70201" et "702001" générerons le même résultat "70200001" mais c'est peut être sans effet.

    Par ailleurs, pour récupérer le contenu après un en-tête standard de 4 caractères, il suffit d'écrire int valeur = atoi(s + 4); sans avoir besoin de modifier s au préalable.

    Salutations

  5. #5
    Membre éclairé
    Homme Profil pro
    bricoleur
    Inscrit en
    Octobre 2014
    Messages
    406
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : bricoleur
    Secteur : Alimentation

    Informations forums :
    Inscription : Octobre 2014
    Messages : 406
    Par défaut
    Merci Guesset pour ces conseils que je viens de suivre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    char *com = "xxxx99"     //par exemple
    char buf0[10];
    int valeur = atoi(com+4);
            sprintf(buf0,"%04d",valeur);
    et je récupère bien avec buf0: xxxx0099

  6. #6
    Membre Expert Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    784
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 784
    Par défaut
    Re, -

    Désolé, j'avais vraiment mal compris.

    On peut se passer de valeur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sprintf(buf0, "%04d", atoi(com+4));
    mais je suis certain que le compilateur l'aura vu, et qu'il aura optimisé le code.

  7. #7
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 908
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 908
    Par défaut
    Ok, je comprends ce que vous voulez dire mais je n’ai jamais entendu parler de cette fonction. Elle n’est pas dans le standard et une recherche rapide ne donne rien.

    Où avez vous vu cette fonction ?

  8. #8
    Membre Expert Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    784
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 784
    Par défaut
    La voici: strnins

  9. #9
    Membre Expert

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2013
    Messages
    1 632
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2013
    Messages : 1 632
    Par défaut
    Bonjour edgarjacobs,

    Citation Envoyé par edgarjacobs Voir le message
    La voici: strnins
    Merci.

    Je faisais ça de mémoire et commençais à penser que j'avais rêvé .

    Elle est assez facile à recréer mais mériterait d'être codée en assembleur qui propose des instructions (x86) dédiées puissantes.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    char * strnins(char * dst, const char * src, size_t size) {
       if(size > strlen(src) || size == 0) return dst;
       for(char *s = dst + strlen(dst); s >= dst; s--) *(s + size) = *s; // size=2 : "abcd"->"ababcd"
       for(int i = 0; i < size; i++) *(dst + i) = *(src +i);
       return dst;
    }
    Salut

  10. #10
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 908
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 908
    Par défaut
    ah OK, je ne connaissais pas

    ça a été écrit par Lars Wirzenius. C'est informaticien finlandais, principalement connu pour avoir été l'un des premiers collaborateurs de Linus Torvalds dans le développement initial de Linux.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Transfert de donné format Excel dans un fichier CSV.
    Par Karim974 dans le forum Scripts/Batch
    Réponses: 1
    Dernier message: 08/09/2023, 08h59
  2. Réponses: 5
    Dernier message: 13/03/2008, 10h03
  3. [JXL] Creer un document excel avec un format de cellule donné
    Par guybrush007 dans le forum Documents
    Réponses: 2
    Dernier message: 29/03/2007, 11h35
  4. Réponses: 1
    Dernier message: 23/11/2006, 15h22
  5. Date courante au format donné
    Par afrikha dans le forum Langage
    Réponses: 2
    Dernier message: 15/07/2006, 14h38

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