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 :

vector<byte> n'est pas d'accord.


Sujet :

C++

  1. #1
    Membre régulier
    Homme Profil pro
    Second de cuisine
    Inscrit en
    Avril 2005
    Messages
    193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Second de cuisine
    Secteur : Alimentation

    Informations forums :
    Inscription : Avril 2005
    Messages : 193
    Points : 99
    Points
    99
    Par défaut vector<byte> n'est pas d'accord.
    Bonjour !

    Voici le code en question:
    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
     
    /* le contexte */
    // int len
    // int bytes
    // struct Packet { vector<byte> bytes; };
    // char* substr(char*, int, int); -> cf. manuel PHP. Pareil ^^
     
    XServer::Packet PacketFactory::CreatePacket(char *s) {
    	len = strlen(s);
    	bytes = floor((float)len/2)-floor((float)len/6);
    	for(int i=1; i<=bytes; ++i) {
    		cout << "Pushing " << substr(s, (i-1)*3, 1) << endl;
    		Packet.bytes.push_back(substr(s, (i-1)*3, 1));
    	}
    	Packet.index = 0;
    	cout << "Created packet : " << Packet.bytes.size() << endl;
    	for(int i=0; i<bytes; ++i) {
    		cout << "byte " << i << Packet.bytes[i] << endl;
    	}
    	return Packet;
    }
    Résultat (En utilisant s = "01 00 01 00 00 00 00 00 00 00 00 00 00 00")
    Pushing 1
    Pushing 0
    Pushing 1

    [..] Plein de Pushing 0
    Created Packet 14
    Byte 0
    Byte 1
    Byte 2
    Byte 3
    Byte 4
    [..] tout est vide ? Rien ne s'affiche

    (Et oui, les smiley sont sur ma console ! Je suis serieux xD)

    De plus, j'ai essayé d'utiliser Packet.bytes.at(i), cela ne marche pas non plus !

    Merci d'avance.

  2. #2
    Membre averti
    Profil pro
    professeur des universités à la retraite
    Inscrit en
    Août 2008
    Messages
    364
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : professeur des universités à la retraite

    Informations forums :
    Inscription : Août 2008
    Messages : 364
    Points : 439
    Points
    439
    Par défaut
    Pourquoi ne pas créer dans ta fonction une string du C++ initialisée avec ton s, puis travailler avec cette string du C++ et utiliser la fonction membre substr de la classe string, tu pourrais sans doute contrôler alors un peu mieux ce que tu fais à l'aide des outils du C++, non ?
    (et aussi : pourquoi utiliser des float au lieu de double ?)
    D'autre part qu'est-ce que c'est ce Packet.index qui d'après tes premières lignes en commentaire ne semble tout simplement pas exister ?
    Et encore : pourquoi donner le même nom à deux variables nommées toutes deux 'bytes' - l'une de type int l'autre de type vector<bytes> - bien distinctes, le type même de la chose à éviter, en principe...

  3. #3
    Membre éprouvé Avatar de Steph_ng8
    Homme Profil pro
    Doctorant en Informatique
    Inscrit en
    Septembre 2010
    Messages
    677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 677
    Points : 997
    Points
    997
    Par défaut
    Bonsoir.

    Pour commencer, pourquoi utiliser un char* et créer une fonction qui retourne une sous-chaîne ? (je serais curieux de voir con code, d'ailleurs...)
    En C++, le type std::string est adapté à tous les usages de chaîne de caractères (avec un transtypage implicite char* std::string, à condition que la chaîne se termine par la caractère nul)
    La fonction membre std::string::substr(size_type, size_type) fait déjà ce que tu peux en attendre.

    Ensuite, tu fais des transtypages à la C.
    Si tu veux faire du C++, va jusqu'au bout !
    F.A.Q. C++: Comment effectuer une conversion de type explicite (cast) ?
    Et puis pour le cas qui nous intéresse, un simple floor(len / 2.) suffirait ; toutefois le résultat de la division devient un double.
    Quoique, en y repensant, une division entière (donc sans floor) est parfaitement adaptée à ton cas.

    Autre chose, tu fais une boucle sur l'intervalle [1, bytes] et une autre sur l'intervalle [0, bytes[.
    Ce n'est pas très cohérent.
    De plus, si tu commences à 0 pour ta première boucle, ça t'évitera d'avoir à faire une soustraction...

    Pour finir, il y a quelque chose qui me surprend beaucoup.
    Si j'ai bien suivi, substr(s, (i-1)*3, 1) est censée ne retourner qu'un caractère.
    En l'occurrence, le premier caractère de chaque paire.
    Alors j'ai du mal à comprendre comment tu peux transformer tes "01" en 1 ; normalement, seul le '0' devrait être lu.

    Au fait, on peut créer un byte à partir d'un char*

  4. #4
    Membre éprouvé Avatar de Steph_ng8
    Homme Profil pro
    Doctorant en Informatique
    Inscrit en
    Septembre 2010
    Messages
    677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 677
    Points : 997
    Points
    997
    Par défaut
    Grilled...

    Citation Envoyé par ptyxs Voir le message
    D'autre part qu'est-ce que c'est ce Packet.index qui d'après tes premières lignes en commentaire ne semble tout simplement pas exister ?
    Bien vu, je ne l'avais pas remarqué...

    Citation Envoyé par ptyxs Voir le message
    Et encore : pourquoi donner le même nom à deux variables nommées toutes deux 'bytes' - l'une de type int l'autre de type vector<bytes> - bien distinctes, le type même de la chose à éviter, en principe...
    Elle ne partagent pas le même espace de nom.
    Alors où est le problème ?

  5. #5
    Membre averti
    Profil pro
    professeur des universités à la retraite
    Inscrit en
    Août 2008
    Messages
    364
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : professeur des universités à la retraite

    Informations forums :
    Inscription : Août 2008
    Messages : 364
    Points : 439
    Points
    439
    Par défaut
    Citation Envoyé par Steph_ng8 Voir le message
    Elle ne partagent pas le même espace de nom.
    Alors où est le problème ?
    En effet, pas de clash, mais il me semble que c'est chercher à ajouter un zest de confusion possible bien inutile....

  6. #6
    Membre éprouvé Avatar de Steph_ng8
    Homme Profil pro
    Doctorant en Informatique
    Inscrit en
    Septembre 2010
    Messages
    677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 677
    Points : 997
    Points
    997
    Par défaut
    Ok.
    vu comme ça...

  7. #7
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut,
    Citation Envoyé par ptyxs Voir le message
    Pourquoi ne pas créer dans ta fonction une string du C++ initialisée avec ton s, puis travailler avec cette string du C++ et utiliser la fonction membre substr de la classe string, tu pourrais sans doute contrôler alors un peu mieux ce que tu fais à l'aide des outils du C++, non ?
    (et aussi : pourquoi utiliser des float au lieu de double ?)
    D'autre part qu'est-ce que c'est ce Packet.index qui d'après tes premières lignes en commentaire ne semble tout simplement pas exister ?
    Et encore : pourquoi donner le même nom à deux variables nommées toutes deux 'bytes' - l'une de type int l'autre de type vector<bytes> - bien distinctes, le type même de la chose à éviter, en principe...
    Citation Envoyé par Steph_ng8 Voir le message
    Bonsoir.

    Pour commencer, pourquoi utiliser un char* et créer une fonction qui retourne une sous-chaîne ? (je serais curieux de voir con code, d'ailleurs...)
    En C++, le type std::string est adapté à tous les usages de chaîne de caractères (avec un transtypage implicite char* std::string, à condition que la chaîne se termine par la caractère nul)
    La fonction membre std::string::substr(size_type, size_type) fait déjà ce que tu peux en attendre.

    Ensuite, tu fais des transtypages à la C.
    Si tu veux faire du C++, va jusqu'au bout !
    F.A.Q. C++: Comment effectuer une conversion de type explicite (cast) ?
    Et puis pour le cas qui nous intéresse, un simple floor(len / 2.) suffirait ; toutefois le résultat de la division devient un double.
    Quoique, en y repensant, une division entière (donc sans floor) est parfaitement adaptée à ton cas.

    Autre chose, tu fais une boucle sur l'intervalle [1, bytes] et une autre sur l'intervalle [0, bytes[.
    Ce n'est pas très cohérent.
    De plus, si tu commences à 0 pour ta première boucle, ça t'évitera d'avoir à faire une soustraction...

    Pour finir, il y a quelque chose qui me surprend beaucoup.
    Si j'ai bien suivi, substr(s, (i-1)*3, 1) est censée ne retourner qu'un caractère.
    En l'occurrence, le premier caractère de chaque paire.
    Alors j'ai du mal à comprendre comment tu peux transformer tes "01" en 1 ; normalement, seul le '0' devrait être lu.

    Au fait, on peut créer un byte à partir d'un char*
    Attention, si le char est en réalité destiné à renvoyer des valeurs numérique (comprises entre 0 et 255), comme on peut raisonnablement le penser, la solution ne passe pas par la En effet, la std::string ne peut afficher que les caractères ayant une valeur supérieure à32 (le caractère représenté par l'espace).

    De toute évidence, si on essaye de pousser une valeur "01" (qui est en fait 0x01 et qui correspond simplement... à 1 ) c'est que l'on n'est pas dans le cas où la std::string est utile.

    Dans ce cas, il faut bel et bien travailler avec des tableaux de char, et même de unsigned char

    @ DakM : j'aimerais en savoir plus sur les valeurs que tu reçois, et surtout sur le protocole qui te permet de les recevoir.

    En effet, tu semble vouloir utiliser de byte, c'est à dire des (unsigned) char pour la valeur qu'ils représentent comprise entre 0 et 255 (car '1' ne vaut pas ... 1 ).

    Si, comme je le pense du moins, c'est le cas, c'est tout ton système de récupération des valeurs et de remplissage du packet qu'il faudra revoir

    Le problème, c'est que je ne pars que de suppositions peut etre fausses, et il est donc nécessaire d'en savoir plus
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  8. #8
    Membre éprouvé Avatar de Steph_ng8
    Homme Profil pro
    Doctorant en Informatique
    Inscrit en
    Septembre 2010
    Messages
    677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 677
    Points : 997
    Points
    997
    Par défaut
    Hum...
    Tel que présenté, j'ai l'impression que le char * est utilisé comme une simple chaîne de caractères.
    Donc std::string paraît tout à fait approprié, quitte à utiliser std::string::c_str().

    Sauf si la chaîne d'entrée est en réalité "0x01 0x00 0x01 0x00...".
    Dans ce cas-là, d'accord.
    Quoique rien ne lui interdit d'utiliser std::basic_string<unsigned char>.

    Sinon, encore une fois, je suis curieux de voir le code de substr...

  9. #9
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Citation Envoyé par Steph_ng8 Voir le message
    Hum...
    Tel que présenté, j'ai l'impression que le char * est utilisé comme une simple chaîne de caractères.
    Donc std::string paraît tout à fait approprié, quitte à utiliser std::string::c_str().

    Sauf si la chaîne d'entrée est en réalité "0x01 0x00 0x01 0x00...".
    Dans ce cas-là, d'accord.
    Quoique rien ne lui interdit d'utiliser std::basic_string<unsigned char>.

    Sinon, encore une fois, je suis curieux de voir le code de substr...
    Le problème, c'est qu'à voir la série à obtenir, j'aurais tendance à dire qu'il s'agit de byte, et donc de séries de bits...

    D'autant plus que, si l'on regarde correctement le code, il ne prend que l'équivalent d'un caractère sur trois, si, du moins substr agit bel et bien comme on peut l'envisager avec un prototype proche de std::string substr(std::string const & in, int start, int count).

    De plus, std::basic_string<unsigned char> posera de toute manière exactement le même problème dans le sens où... elle considérera les unsigned char comme devant être affichés sous la forme de leur représentation graphique dans la table ASCII et non sous la forme de leur valeur.

    En définitive, si les (unsigned ) char doivent, effectivement etre considérés comme des valeurs numérique, il ne reste qu'une solution cohérente : l'usage d'un std::vector< (unsinged) char>
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  10. #10
    Membre averti
    Profil pro
    professeur des universités à la retraite
    Inscrit en
    Août 2008
    Messages
    364
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : professeur des universités à la retraite

    Informations forums :
    Inscription : Août 2008
    Messages : 364
    Points : 439
    Points
    439
    Par défaut
    Oui, mais le malheur est que sur toutes ces questions nous en somme réduits à des suppositions, l'auteur n'ayant pas expliqué de façon suffisamment précise ce qu'il essayait de faire vraiment... La balle est maintenant dans son camp...

  11. #11
    Membre éprouvé Avatar de Steph_ng8
    Homme Profil pro
    Doctorant en Informatique
    Inscrit en
    Septembre 2010
    Messages
    677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 677
    Points : 997
    Points
    997
    Par défaut
    Citation Envoyé par koala01 Voir le message
    D'autant plus que, si l'on regarde correctement le code, il ne prend que l'équivalent d'un caractère sur trois, si, du moins substr agit bel et bien comme on peut l'envisager avec un prototype proche de std::string substr(std::string const & in, int start, int count).
    C'est bien ça qui me chiffonne...

    Citation Envoyé par koala01 Voir le message
    De plus, std::basic_string<unsigned char> posera de toute manière exactement le même problème dans le sens où... elle considérera les unsigned char comme devant être affichés sous la forme de leur représentation graphique dans la table ASCII et non sous la forme de leur valeur.
    Ah...
    Et il se passe quoi pour les caractères dont le code ASCII est compris entre 0 et 32 (exclus) ?
    Je veux dire, tant qu'on ne cherche pas à les afficher ?
    Au fait, de mémoire, les codes ASCII de '\n', '\r' et '\t' sont compris entre 0 et 32...

    Citation Envoyé par koala01 Voir le message
    En définitive, si les (unsigned ) char doivent, effectivement etre considérés comme des valeurs numérique, il ne reste qu'une solution cohérente : l'usage d'un std::vector< (unsinged) char>
    À mon avis (mais ce n'est qu'une autre supposition ), le but du problème est justement de transformer des données d'entrée (clavier ? fichier ?) en tableau de byte...

  12. #12
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Citation Envoyé par Steph_ng8 Voir le message
    C'est bien ça qui me chiffonne...
    C'est bien pour cela que j'ai pris les disposition d'usage en disant "si c'est bien ce qu'on croit

    Ah...
    Et il se passe quoi pour les caractères dont le code ASCII est compris entre 0 et 32 (exclus) ?
    Je veux dire, tant qu'on ne cherche pas à les afficher ?
    Au fait, de mémoire, les codes ASCII de '\n', '\r' et '\t' sont compris entre 0 et 32...
    Oui, et tu as aussi le bell, le esc, le '\b', et tous les autres...

    Essaye de les introduire dans une std::string, et de les afficher... tu verra le résultat ... mais prévois des boulles quies
    À mon avis (mais ce n'est qu'une autre supposition ), le but du problème est justement de transformer des données d'entrée (clavier ? fichier ?) en tableau de byte...
    Non, pour autant que j'en sache (grace aux différentes discussions récentes, le but est de récupérer les données depuis un socket
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  13. #13
    Membre éprouvé Avatar de Steph_ng8
    Homme Profil pro
    Doctorant en Informatique
    Inscrit en
    Septembre 2010
    Messages
    677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 677
    Points : 997
    Points
    997
    Par défaut
    Citation Envoyé par koala01 Voir le message
    Essaye de les introduire dans une std::string, et de les afficher... tu verra le résultat ... mais prévois des boulles quies
    Ah donc c'est bien ce que je pensais, c'est lorsqu'on veut les afficher qu'il y a un problème...

    Citation Envoyé par koala01 Voir le message
    Non, pour autant que j'en sache (grace aux différentes discussions récentes, le but est de récupérer les données depuis un socket
    Ah oui, c'est vrai.

    Bon, je crois que l'on peut arrêter les suppositions et attendre que DakM vienne mettre d'autres informations...

  14. #14
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Citation Envoyé par Steph_ng8 Voir le message
    Ah donc c'est bien ce que je pensais, c'est lorsqu'on veut les afficher qu'il y a un problème...
    Et pour cause: la table ASCII est, justement, une table utilisée pour l'affichage

    Ceci dit, il risque aussi d'y avoir des problèmes à l'interprétation, purs et simples : '\0' met classiquement fin à la chaine de caractères (tout caractère qui suit le '\0' est ignoré, fut-il affichable ), alors qu'une valeur nulle est tout à fait possible dans un paquet de données, sans pour autant représenter la fin du paquet
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  15. #15
    Membre éprouvé Avatar de Steph_ng8
    Homme Profil pro
    Doctorant en Informatique
    Inscrit en
    Septembre 2010
    Messages
    677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 677
    Points : 997
    Points
    997
    Par défaut
    Citation Envoyé par koala01 Voir le message
    Ceci dit, il risque aussi d'y avoir des problèmes à l'interprétation, purs et simples : '\0' met classiquement fin à la chaine de caractères (tout caractère qui suit le '\0' est ignoré, fut-il affichable ), alors qu'une valeur nulle est tout à fait possible dans un paquet de données, sans pour autant représenter la fin du paquet
    Ah oui, exact...

  16. #16
    Membre régulier
    Homme Profil pro
    Second de cuisine
    Inscrit en
    Avril 2005
    Messages
    193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Second de cuisine
    Secteur : Alimentation

    Informations forums :
    Inscription : Avril 2005
    Messages : 193
    Points : 99
    Points
    99
    Par défaut
    bonjour !
    Whoa tellement de réponses !

    Alors:
    Fonction substr():
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int substr(char *s, int start, int length) {
    	char t[2] = {s[start], s[(start+length)]};
    	return (int)strtol(t, NULL, 16);
    }

    (Hé oui, elle est spécifique)

    Pourquoi ?

    Le dialogue client/Server se fait avec ceci: (exemple)
    Bonjour: 01 00 00 01
    Bonjour moi c'est le serveur: 01 00 01 01 00 01
    tu vas bien ?: 02 00 00 05
    moi c'est developpez.com: 05 ff 03 64 6f

    Donc mon substr

  17. #17
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Citation Envoyé par DakM Voir le message
    bonjour !
    Whoa tellement de réponses !

    Alors:
    Fonction substr():
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int substr(char *s, int start, int length) {
    	char t[2] = {s[start], s[(start+length)]};
    	return (int)strtol(t, NULL, 16);
    }

    (Hé oui, elle est spécifique)

    Pourquoi ?
    Parce qu'elle permet de lever un doute sur son utilisation

    Une petite remarque en passant: Si tu renvoie d'office un char[2], la taille n'a strictement pas lieu d'être utilisée (tu peux supprimer l'argument et utiliser directement char t[2] = {s[start], s[(start+1)]} d'autant plus que, telle qu'elle est écrite, elle ment sur l'utilisation de l'argument length, qui semble indiquer une taille, alors qu'il indique plutot un nombre de caractères à passer entre le premier caractère qui sera pris (et qui se trouve à la position start) et celui qu'il faudra placer en deuxième position
    Amuse toi par exemple à observer la sortie de ce tout petit programme..
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    int main()
    {
        char *str="Bonjour\0";
        int i = 0;
        while(str[i]!='\0')
        {
            std::cout<<substr(str,0,i)<<std::endl;
            ++i
        }
        return 0;
    }
    Tu verra, ca vaut le coup, et je ne crois pas que ce soit ce à quoi tu t'attendais
    Le dialogue client/Server se fait avec ceci: (exemple)
    Bonjour: 01 00 00 01
    Bonjour moi c'est le serveur: 01 00 01 01 00 01
    tu vas bien ?: 02 00 00 05
    moi c'est developpez.com: 05 ff 03 64 6f

    Donc mon substr
    Oui, mais on ne sait toujours pas si 01, 00, 02,05,ff,03,64 et 6f sont envoyés sous la forme de chaine ou sous la forme de valeur!

    Et tout le problème vient de là!!!

    En effet, si c'est sous forme de chaine de caractères (qu'on les manipule à la mode C ou à la mode C++, cela n'a pas énormément d'importance ), il faut prendre deux caractères et les "triturer" pour récupérer une valeur qui entre dans un byte (qui, classiquement correspond à la taille d'un caractère), alors que si c'est sous la forme de valeur (représentée ici en format hexadécimal), il y a peut etre des choses plus intéressantes à faire
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  18. #18
    Membre régulier
    Homme Profil pro
    Second de cuisine
    Inscrit en
    Avril 2005
    Messages
    193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Second de cuisine
    Secteur : Alimentation

    Informations forums :
    Inscription : Avril 2005
    Messages : 193
    Points : 99
    Points
    99
    Par défaut
    Je recois ca par un socket, donc le buffer est un char *buf = "01 01 01 01 01 01"!

  19. #19
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Citation Envoyé par DakM Voir le message
    Je recois ca par un socket, donc le buffer est un char *buf = "01 01 01 01 01 01"!
    Ben, tu dis cela comme si cela allait de soi, mais cela aurait pu etre un groupe de 6 bytes (donc de 6 ensemble de 8 bits ) et 01 aurait pu représenter... la valeur hexadécimale reçue

    Pour info, tu peux recevoir par socket des informations issues de port COM et similaires qui sont en réalité ... des ensembles de 8 bits, ayant des valeurs correspondant à des caractères non affichables de la table ASCII.

    Mais, dans ce cas, je te conseillerais fortement de virer au plus tot ton char* pour utiliser la classe string, accessible dans l'espace de noms std par inclusion du fichier <string>

    Ta fonction pourrait alors ressembler à quelque chose comme
    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
    XServer::Packet PacketFactory::CreatePacket(std::string const & buf) 
    {
        std::vector<std::string> prepare; // XServer::Packet serait un typedef?
        std::stringstram ss(buf)
        /* on commence par séparer chaque paire de caractères représentatifs
        while(ss)
        {
            std::string temp;
            ss>>temp;
            prepare.push_back(temp);
        }
        /* allez, amusons nous à les afficher */
        for(size_t i=0;i<prepare.size();++i)
        {
           std::cout<<"elemen ["<<i<<"] :"<<prepare[i]<<std:endl;
        }
        /* si XServer::Packet n'est pas un typedef de std::vector<std::string>
         * on convertit chaque chaine présente dans prepare ;)
         */
        return /* ce qui soit prepare, soit le résulat de la conversion */
    }
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  20. #20
    Membre régulier
    Homme Profil pro
    Second de cuisine
    Inscrit en
    Avril 2005
    Messages
    193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Second de cuisine
    Secteur : Alimentation

    Informations forums :
    Inscription : Avril 2005
    Messages : 193
    Points : 99
    Points
    99
    Par défaut
    Oui mais je recois en tant que char*, n'est-il pas couteux de faire une convertion vers un string au lieu de rester sur du char* et de bosser avec ca ?

Discussions similaires

  1. Programmer encore en VB 6 c'est pas bien ? Pourquoi ?
    Par Nektanebos dans le forum Débats sur le développement - Le Best Of
    Réponses: 85
    Dernier message: 10/03/2009, 14h43
  2. Réponses: 10
    Dernier message: 30/06/2008, 19h59
  3. LIKE de tout ce qui n'est pas compris entre a<-&
    Par DjinnS dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 28/07/2003, 13h09
  4. [VB6] générer un recordset qui n'est pas lier à un bdd
    Par damyrid dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 05/06/2003, 17h48
  5. Index n'est pas a jour
    Par touhami dans le forum Paradox
    Réponses: 5
    Dernier message: 11/12/2002, 14h47

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