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 :

Probléme de récupération d'un array


Sujet :

C++

  1. #1
    Membre actif
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2020
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2020
    Messages : 51
    Par défaut Probléme de récupération d'un array
    Bonsoir, j'ai fais un script qui supprime un élément d'un array, ensuite qui mélange. Et quand j'essaye de récupérer un élément du tableau avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    cout << formatted_arr[0] << endl;
    j'ai qu'un seul caractère au lieu d'avoir l'élèment 0x.., 0x.., 0x.., 0x.. en BYTE de ce qui est généré.

    J'aimerai savoir ce que j'ai oublié ???

    voici le code :

    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
     
    #include <iostream>
    #include <algorithm>
    #include <vector>
    #include <ctime>
    #include <cstdlib>
    #include <windows.h>
    using namespace std;
    template<typename type>
    void mix(std::vector<std::vector<type>>& vec){
    if(vec.empty()) return;
    srand(GetTickCount());
    int msize = vec.size();
    int ssize = vec[0].size();
    for(int i ={}; i < msize; ++i) {
    int rpos = rand() % msize;
    std::vector<type> cpy;
    cpy = vec[i];
    vec[i] = vec[rpos];
    vec[rpos] = cpy;
        }
    } 
    template<typename type>
    void rem(std::vector<std::vector<type>>& vec, int elemnr){
    if(vec.empty() || 0 > elemnr || vec.size() < elemnr) return;
    vec.erase(vec.begin() + elemnr);
    } 
    class arr_to_str{
    public:
    template<typename type>
    arr_to_str(std::vector<std::vector<type>>& by) : m_buff{}{
    const char * frmt = {};
    char temp[10] = {};
    //this->m_buff.append("{ ");
    for(int i ={}; i < by.size(); ++i){
    this->m_buff.append("{ ");
    for(int j ={}; j < by[i].size(); ++j){
    if(j == by[i].size() - 1) frmt = "0x%02X";
    else frmt =  "0x%02X, ";
    sprintf(temp, frmt, by[i][j]);
    this->m_buff.append(temp);
    }
    this->m_buff.append(" }");
    }
    //this->m_buff.append(" }");
    }
    const char * operator()(){
    return this->m_buff.c_str();
    }
    operator const char * (){
    return this->m_buff.c_str();
    }
    private:
    std::string m_buff;
    };
    int main(){
    std::vector<std::vector<BYTE>> a = { {0xE3, 0x02, 0x5E, 0x01}, {0x62, 0x02, 0x1F, 0x01}, {0xB7, 0x02, 0x3B, 0x01}, {0xC3, 0x02, 0x42, 0x01}, {0xCA, 0x02, 0x47, 0x01} };
    rem(a, 0);
    mix(a);
    arr_to_str ats(a);
    const char * formatted_arr = ats; 
     
    cout << formatted_arr[0] << endl;
     
     
     
    system("pause");
    return 0;
    }

  2. #2
    Membre confirmé
    Homme Profil pro
    .
    Inscrit en
    Octobre 2019
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : .

    Informations forums :
    Inscription : Octobre 2019
    Messages : 21
    Par défaut
    Le type sous-jacent de BYTE est probablement char (que ce soit signed ou unsigned ou ni l'un ni l'autre). std::cout présume qu'un char représente, bien naturellement, un caractère donc c'est ce que tu obtiens. Par contre, si tu veux rendre visible la valeur integrale du char en hexadécimal, ajoute une conversion de type et std::hex. Le préfix "0x" n'est pas ajouté automatiquement non plus, alors ajoute-le de même. On obtient :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cout << "0x" << std::hex << static_cast<int>(formatted_arr[0]) << endl;
    En anglais, on appelle std::hex "I/O manipulator", manipulateur entrée/sortie. Il coexiste avec tels que std::dec, std::boolalpha ou bien std::uppercase.

  3. #3
    Membre actif
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2020
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2020
    Messages : 51
    Par défaut
    En faite je cherche a transformer la chaine pour l’intégrer de cette manière : const char teste[4][4] = {formatted_arr};.

    Quand je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cout << formatted_arr << endl;
    J'ai ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    { 0x62, 0x02, 0x1F, 0x01 }, { 0xB7, 0x02, 0x3B, 0x01 }, { 0xC3, 0x02, 0x42, 0x01 }, { 0xCA, 0x02, 0x47, 0x01 }
    Comment faire ?

    après par exemple si je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cout << teste[1]<< endl;
    Je récupère : { 0xB7, 0x02, 0x3B, 0x01 }

  4. #4
    Membre confirmé
    Homme Profil pro
    .
    Inscrit en
    Octobre 2019
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : .

    Informations forums :
    Inscription : Octobre 2019
    Messages : 21
    Par défaut
    Désolé, je n'ai pas lu ta question assez attentivement.

    Le type de formatted_arr[0] est const char, donc l'afficher ne fait rien qu'afficher un caractère à l'écran. Le std::vector a disparu, le compilateur n'en sais rien dans ce contexte particulier.

    Dans la classe arr_to_str tu convertis le std::vector en chaîne de caractères. L'information structurelle de std::vector est perdu. Soit tu récupères les ensembles délimités par accolades en utilisant les fonctions dans std::string (comme std::string::find), soit tu retiens la structure (et abandonnes la conversion effectuée par arr_to_str) et, par exemple, définis un nouveau operator<< qui affiche un std::vector :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    std::ostream &operator<<(std::ostream &os, const std::vector<BYTE> &v)
    {
        os << std::hex << '{';
        for (BYTE b : v)
            os << " 0x" << static_cast<int>(b);
        os << " }";
     
        return os;
    }
    (À noter que ce bout de code utilise le contenu de ma dernière réponse, du coup pas totalement inutile.)

    Maintenant,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cout << formatted_arr[1] << endl;
    te donnera le ŕésultat désiré.

  5. #5
    Membre actif
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2020
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2020
    Messages : 51
    Par défaut
    Marche pas, j'ai ça comme erreur :
    [Error] a function-definition is not allowed here before '{' token "std::ostream &operator<<(std::ostream &os, const std::vector<BYTE> &v){"

  6. #6
    Membre confirmé
    Homme Profil pro
    .
    Inscrit en
    Octobre 2019
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : .

    Informations forums :
    Inscription : Octobre 2019
    Messages : 21
    Par défaut
    Mais où l'as-tu mis ? Déplace la définition de operator<< hors de toute fonction juste après les inclusions d'en-têtes. Je l'ai essayé, ça marche bien.

Discussions similaires

  1. Problème d'affichage tableau (array)
    Par flashnet dans le forum Langage
    Réponses: 6
    Dernier message: 03/11/2010, 22h39
  2. Problème d'affichage avec trace
    Par WriteLN dans le forum Flash
    Réponses: 10
    Dernier message: 22/10/2003, 16h59
  3. [Kylix] problème d'affichage
    Par scalvi dans le forum EDI
    Réponses: 1
    Dernier message: 18/06/2003, 10h07
  4. Réponses: 1
    Dernier message: 06/03/2003, 11h57
  5. probléme d'affichage d'une fiche
    Par sb dans le forum Composants VCL
    Réponses: 7
    Dernier message: 29/08/2002, 09h43

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