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++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    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
    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 très actif
    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
    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 émérite 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 : 40
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 677
    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 ?

  4. #4
    Membre très actif
    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
    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....

  5. #5
    Membre émérite 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 : 40
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Informatique

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

  6. #6
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    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

  7. #7
    Membre émérite 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 : 40
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 677
    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*

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