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 :

quel est le decoupage de chaine le + rapide


Sujet :

C++

  1. #1
    Membre confirmé
    Profil pro
    Ingénieur
    Inscrit en
    Juillet 2006
    Messages
    61
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur

    Informations forums :
    Inscription : Juillet 2006
    Messages : 61
    Par défaut quel est le decoupage de chaine le + rapide
    connaissez vous plusieurs moyen pour decouper les chaine de caractere?
    si oui quel sont-ils et quel est le plus rapide?


    pour info: je travaille sur une commande d'un robot par le network, et pour cela je met les coordonnées des capteur a la suite dans une chaine de caractere que j envoie enssuite avec un socket.
    j essaye de reduire au maximun les temps de decalage

  2. #2
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    'découper' ?

  3. #3
    Membre confirmé Avatar de harsh
    Inscrit en
    Février 2005
    Messages
    229
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 229
    Par défaut
    Si tu connais à l'avance la séquence des données (et donc leur taille, quitte à laisser vide certains champs), il te suffit juste de copier le nombre d'octet voulus de ta chaîne avec un petit strcat (char *src, char *dst, size_t size);

    Sinon il te faut rechercher les balises séparant tes données.

    Dans tous les cas, tu ne dépasseras jamais une passe de lecture, c'est insignifiant.

  4. #4
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    il te suffit juste de copier le nombre d'octet voulus de ta chaîne avec un petit strcat (char *src, char *dst, size_t size);
    Tu veux dire avec std::string::substr

  5. #5
    Membre Expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Par défaut
    On peut aussi faire avec une expression rationnelle.

  6. #6
    Membre confirmé
    Profil pro
    Ingénieur
    Inscrit en
    Juillet 2006
    Messages
    61
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur

    Informations forums :
    Inscription : Juillet 2006
    Messages : 61
    Par défaut
    j'ai fait comme ca mais il y a surement mieux

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    int j=0;
    int ii=1;
    int k=0;
    if (buffer[0]==':'){
    	while(buffer[ii] != ';'){
    		if(buffer[ii]==','){j++;ii++;k=0;}
    		posit[j][k] = buffer[ii];
    		ii++;k++;
    	}
    }

  7. #7
    Membre émérite
    Avatar de Antoine_935
    Profil pro
    Développeur web/mobile
    Inscrit en
    Juillet 2006
    Messages
    883
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur web/mobile

    Informations forums :
    Inscription : Juillet 2006
    Messages : 883
    Par défaut
    Citation Envoyé par seriousme
    On peut aussi faire avec une expression rationnelle.
    les expressions rationnelles sont lentes.
    Pourrais tu nous donner un exemple de la chaîne à découper ?

  8. #8
    Inactif  

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    534
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 534
    Par défaut
    Bonjour,

    essayons :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    void  split ( vector<string>& V , const string& z , const string& delim )
     { size_t p = 0 ;
       size_t k = 0 ;
       while ( true )
       { k = z.find_first_not_of(  delim, k ) ;
         if( k == string::npos ) break ;
         p = z.find_first_of( delim , k ) ;
         V.push_back( z.substr( k , p-k )   );
         k = p ;
       }
     }
    Ou encore :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    string csplit (  const string& z , const string& delim )
     { string s("") ;
       size_t p = 0 ;
       size_t k = 0 ;
       while ( true )
       { k = z.find_first_not_of(  delim, k ) ;
         if( k == string::npos ) break ;
         p = z.find_first_of( delim , k ) ;
         s +=  z.substr( k , p-k ) ;
         k = p ;
       }
       return s ;
     }
    Cordialement.

  9. #9
    Membre confirmé
    Profil pro
    Ingénieur
    Inscrit en
    Juillet 2006
    Messages
    61
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur

    Informations forums :
    Inscription : Juillet 2006
    Messages : 61
    Par défaut
    Ma chaine est une suite de nombre que je crée donc elle peu changer mais pour l instant c ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    :0.125645,1.24564466,...,4.05468;
    dj.motte, je prefererais ne pas passer par des string, ma chaine est en char[]

  10. #10
    Inactif  

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    534
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 534
    Par défaut
    Bonsoir,

    Vous pouvez utiliser un "string" à la place d' un "char[]".
    Dans votre cas :
    split( V, z, ":," )
    ou
    csplit ( z, ":," )
    Ou est le problème ?

    Cordialement.

  11. #11
    Membre confirmé Avatar de Sachiel31
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    121
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 121
    Par défaut
    Bonjour,

    si tu préfères garder ta chaîne en char[], tu peux utiliser la fonction strtok() de la librairie string.

    syntaxe:
    strtok ( const char * string, const char * delimiters )

    dans ton cas cela pourrait donner :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    char sep[] = ":,;";
    char* resultat;
     
    resultat = strtok(buffer, sep);
    while (pch != NULL)
    {
        printf ("%s\n",resultat ); // pour l'afficher par exemple
        resultat = strtok (NULL, sep);
    }
    Je pense que c'est assez simple, non?

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 401
    Par défaut
    Bonjour,

    Si tu préfères garder ta chaîne en char[], tu peux utiliser la fonction strtok_r() de la bibliothèque standard, déclarée dans le header <string.h> ou <cstring>.

    Note: sous Visual, strtok_r() n'est disponible qu'à partir de Visual studio 2005, sous le nom strtok_s().
    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.

  13. #13
    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
    Petite précision : strtok_r ne fait pas à ma connaissance (je ne connais pas bien la versino 2003) partie du C++. C'est une fonction C99, et il est fort possible qu'un compilateur C++ ne l'implémente pas.
    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.

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 401
    Par défaut
    Elle doit aussi être POSIX.quelquechose non?
    Enfin, ce doit être réimplémentable, au besoin...
    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.

  15. #15
    Inactif  

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    534
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 534
    Par défaut
    Bonjour,

    strtok c' est plus du C que du C++.
    Attention, aprés le passage de strtok, votre buffer sera inutilisable. Pour y remédier si nécessaire, appliquer strtok sur une duplication de votre buffer.

    Je ne comprends votre méfiance pour la classe string, qui peut aisement être restituée sous forme de char * ?

    Cordialement.

  16. #16
    Membre confirmé
    Profil pro
    Ingénieur
    Inscrit en
    Juillet 2006
    Messages
    61
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur

    Informations forums :
    Inscription : Juillet 2006
    Messages : 61
    Par défaut
    merci beaucoup de vos reponses, désolé de reagir si tard mais je m'occuper d'otre chose.

    En faite il se trouve que ma premiere solution posé probleme pour les 0 apré la premiere ","
    Je suis revenu sur vc++6 et j utilise la solution de Sachiel31 qui marche bien.
    Pour Vc++2005, j ai pas encore reessayer

    Merci les gens, a plus

  17. #17
    Membre Expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Par défaut
    Sinon on peut convertir en "string", traiter les données puis récupérer une chaine classique:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    char c_string[32]="abcdef";
    string cpp_string(c_string);
     
    const char* c_string2=cpp_string.c_str();
    En faisant attention à ne pas modifier "c_string2":
    http://c.developpez.com/faq/cpp/?pag...ion_c_str_data

  18. #18
    Membre très actif
    Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Juin 2006
    Messages
    240
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2006
    Messages : 240
    Par défaut
    Pour VC++ 2005 c'est un epu spécial , on trouve 1 classe System::String et une autre std::string, sachant que toute les forms de vc++ utilise des System::String (non compatible avec std::string. mais je suis novice a vérifier donc.

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 401
    Par défaut
    System::String c'est du .Net, pas du C++ normal.
    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.

  20. #20
    Alp
    Alp est déconnecté
    Expert confirmé

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par défaut
    Sinon, il y a aussi le couple std::stringstream/std::getline, ainsi que boost.tokenizer.
    (je crois même qu'il y a pas mal d'autres fonctions dans string_utils ou qqch du genre, chez Boost)

Discussions similaires

  1. [Firebird] Quel est le code le plus rapide ?
    Par ILP dans le forum Bases de données
    Réponses: 8
    Dernier message: 26/10/2009, 14h01
  2. Réponses: 2
    Dernier message: 27/01/2009, 20h01
  3. Array vs Object : Quel est le plus rapide ?
    Par Are-no dans le forum Langage
    Réponses: 2
    Dernier message: 25/09/2008, 10h00
  4. Réponses: 2
    Dernier message: 02/11/2006, 21h21
  5. Réponses: 9
    Dernier message: 19/06/2006, 16h29

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