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 :

Construction d'une trame


Sujet :

C++

  1. #1
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2012
    Messages : 10
    Points : 5
    Points
    5
    Par défaut Construction d'une trame
    Bonsoir à tous,
    J'aimerais savoir comment créer une trame de ce type : "0_1_XXXXXXXX" qui sera envoyé à un serveur. Sachant que les "XXXXXXX" représentent les valeurs des cases d'un tableau de char, je veux simplement ajouter le morceau "0_1_"

    Il faut savoir aussi que je code à partir de C++ builder et via IHM, donc impossible de faire ou autre.

    J'espère une réponse rapide de votre part

  2. #2
    Membre expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Points : 3 156
    Points
    3 156
    Par défaut
    Qu'est-ce que tu entends par une trame ? Un tableau de char, une chaîne à zéro terminal ? Autre chose ?
    Find me on github

  3. #3
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2012
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    C'est une trame que j'envoie à un serveur en fait, le message (message = trame envoyée) est du type char*, il est constitué d'un tableau de char, donc il prend chaque case du tableau et l'envoi au serveur. çà c'est Ok, sauf que le problème est que je veux ajouter "0_1_" avant le contenu du tableau de char dans ma trame/message sauf que je ne sais pas comment faire pour ajouter ce bout de texte à ma trame qui contient déjà les valeurs du tableau. J'ai essaye de faire (tmp = le tableau) mais bien évidemment çà ne fonctionne pas.

  4. #4
    Membre régulier
    Inscrit en
    Juin 2008
    Messages
    140
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 140
    Points : 103
    Points
    103
    Par défaut
    N'est-il pas possible de créer un autre tableau de la taille taille(tmp) + taille("0_1_") en lui mettant les caractères "0_1_" en premier puis en recopiant le tableau tmp à la suite ?

  5. #5
    Membre du Club
    Homme Profil pro
    Developpeur
    Inscrit en
    Mars 2012
    Messages
    146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Developpeur
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2012
    Messages : 146
    Points : 52
    Points
    52
    Par défaut
    Essai peu etre de passer par des AnsiString, ce qui permet de concatener avec des "+" , et ensuite de le récupérer en char* avec la fonction AnsiString.c_str()

  6. #6
    Membre expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Points : 3 156
    Points
    3 156
    Par défaut
    Citation Envoyé par atum25 Voir le message
    Essai peu etre de passer par des AnsiString, ce qui permet de concatener avec des "+" , et ensuite de le récupérer en char* avec la fonction AnsiString.c_str()
    L'idée n'est pas mauvaise (qu'est ce que vous avez en ce moment avec vos "AnsiString" là ? std::string fait bien l'affaire), mais possède un défaut : on va travailler sur des chaînes à zéro terminal et pas vraiment des tableaux de char.

    C'est trivial, mais je me suis amusé à t'écrire une solution bien C++ qui devrait t'aider à comprendre comment ça marche.

    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
    #include <iostream>
    #include <string>
    #include <algorithm>
     
    void FillCharArray(char const * iSrc, size_t iSizeSrc, char * iDest)
    {
      struct CharFiller
      {
        size_t m_index;
        char * m_dest;
        CharFiller(char * iDest): m_index(0), m_dest(iDest)
        {}
     
        void operator () (char iChar)
        {
          m_dest[m_index++] = iChar;
        }
      };
     
      std::string src(iSrc,iSizeSrc);
      CharFiller filler(iDest);
      std::for_each(src.begin(), src.end(), filler);
    }
     
    int main(int argc, char* argv[])
    { 
      size_t msg_size = 8;
      char * Message = new char[msg_size];
      FillCharArray("salutgro", msg_size, Message);
     
      size_t prefix_size = 4;
      char * Prefix = new char[msg_size];
      FillCharArray("0_1_", prefix_size, Prefix);
     
      size_t new_msg_size = prefix_size + msg_size;
      char * NewMessage = new char[new_msg_size];
      FillCharArray(Prefix, prefix_size, NewMessage);
      FillCharArray(Message, msg_size, NewMessage + prefix_size);
     
      // Check the result is correct
      std::cout << std::string(NewMessage,new_msg_size) << std::endl;
     
      delete [] Message;
      delete [] Prefix;
      delete [] NewMessage;
     
      return 0;
    }
    Attention à bien libérer la mémoire à la fin.
    Find me on github

  7. #7
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2012
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    Merci vraiment beaucoup pour toutes vos réponses en attendant j'ai trouvé une petite solution, là voici : (tmp est le tableau)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    char* trame = "0_1_";
            strcat(trame, tmp);
            message1 = trame;

  8. #8
    Membre expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Points : 3 156
    Points
    3 156
    Par défaut
    Cette solution est une horreur : tu n'as pas alloué de mémoire dans trame pour pouvoir concaténer proprement, tu écris dans une zone mémoire qui ne t'appartient pas ! Plantages en vue.

    Lorsque que tu écris

    trame pointe vers une zone mémoire statique qu contient 5 char : les caractères écrits plus le zéro terminal. Si tu concatènes, le tableau utilisé ne contient pas assez de caractères : il en a 5 alors qu'il t'en faut 13. Ce n'est pas parce que ça s'exécute quand tu testes que c'est correct, hélas.
    Find me on github

  9. #9
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2012
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    Là je pense que c'est mieux ? :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    char  trame[50] ;
            strcpy(trame , "0_1_");
            strcat(trame, tmp);
            message1 = trame;
            //delete(trame);
            int x = strlen(message1);

  10. #10
    Membre expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Points : 3 156
    Points
    3 156
    Par défaut
    C'est mieux en effet ! C'est plutôt du C que du C++ mais c'est correct.
    Find me on github

  11. #11
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2012
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    Merci pour vos réponses, et merci à jblecanard pour son aide

Discussions similaires

  1. Obtenir une trame Ethernet
    Par Scorff dans le forum Développement
    Réponses: 15
    Dernier message: 11/09/2006, 12h22
  2. [Réseau] Envoyer une trame tcp
    Par heid dans le forum Web & réseau
    Réponses: 5
    Dernier message: 18/07/2005, 13h07
  3. Comment reconnaître une trame Profibus ?
    Par hasna45 dans le forum Développement
    Réponses: 4
    Dernier message: 25/10/2004, 19h53
  4. construction d'une classe
    Par r0d dans le forum C++
    Réponses: 10
    Dernier message: 16/09/2004, 17h35
  5. Réponses: 2
    Dernier message: 04/02/2004, 22h32

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