2015-11-02 1 views
0

Je développe une application pour envoyer et recevoir des paquets.Ajouter un nouveau champ à un vecteur C++

Je travaille avec la classe std::vector (d'abord j'ai commencé à faire les paquets dans les tableaux et je suis ouvert pour changer la méthode si vous en suggérez un meilleur).

J'ai trouvé this fonction intelligente pour ajouter un const char* à un objet vector. Mais je voudrais en faire un autre pour les ajouter entre {.. , ..} comme je peux le faire en C#. Voici un exemple:

vector<char*> packet; 

char dest[] = { 0x10, 0x10, 0x0, 0x61 }; 
AppendLiteral(packet, dest); //Ok 

/*Or directly:*/ AppendLiteral(packet, { 10, 10, 0, 20 }); //But this does not work 

Est-il possible en C++? Je sais qu'en C# tu peux faire quelque chose comme ça.

Edit:

Une solution possible est:

vector<uint8> telegram; 

vector<uint8> src = { 0x10, 0x10, 0x0, 0x20 }; 
vector<uint8> dst = { 0x10, 0x10, 0x0, 0x60 }; 

telegram.insert(telegram.end(), dst.begin(), dst.end()); 
telegram.insert(telegram.end(), src.begin(), src.end()); 

Avec une petite fonction pour écrire moins:

template <typename T> 
void Append(vector<T> *data, vector<T> *data2) 
{ 
    data->insert(data->end(), data2->begin(), data2->end()); 
} 
+0

Voulez-vous dire 'std :: vector'? – juanchopanza

+0

Oui @juanchopanza – ars1614

+0

Êtes-vous sûr que les nombres de la dernière ligne ne sont pas analysés comme s'ils étaient 'int's? – BinarySpark

Répondre

0

Bien sûr.

std::vector<std::array<char, 4>> packet; 

Essayez celui-ci.

+0

Je ne sais pas si cela fonctionnera pour ajouter' int's à un vecteur 'char *' bien que ... –

+0

Je n'ai pas l'habitude de beaucoup coder en C++ donc j'ai copié collé le code dans mon programme et j'ai J'ai une erreur de paramètre de modèle ambigu avec T. J'ajoute des valeurs hexadécimales donc je ne sais pas si le type de caractère est optimal (en C# j'utilise des tableaux d'octets) – ars1614

+0

Il semble que je me trompe ... – iDingDong

3

Votre vector<char*> contient juste des pointeurs vers des variables de type char. Il ne contient aucune donnée. Ceci est dangereux, car ce pointeur peut se balancer si les objets pointés sont hors de portée.

Utilisez de préférence un type de données comme type d'élément pour votre vector. Si vous souhaitez stocker des chaînes, utilisez std::vector<std::string>. Si vous souhaitez conserver des objets comme char[4], utilisez std::vetor<std::array<char,4>>. Si vous souhaitez conserver des tableaux d'octets de longueur arbitraire, utilisez std::vetor<std::vector<char>>.

int main() 
{ 
    using packet=std::array<char,4>; // also works with packet=std::string 
            //    or packet=std::vector<char> 

    std::vector<packet> packets; 

    packets.push_back({0x10, 0x10, 0x0, 0x61}); 
    packets.push_back({10, 10, 0, 20}); 

    packet p={0x2,0x4,0xa,0xb}; 
    packets.push_back(p); 
} 
+0

Je vois, je vais le faire.Merci – ars1614

+0

J'ai essayé mais ça ne marche pas. Comment rejoindriez-vous deux arrais? – ars1614

+0

Qu'avez-vous essayé et qu'est-ce qui n'a pas fonctionné? Sois plus précis. Aussi, vous continuez à changer votre question - c'est mauvais, car il est difficile d'atteindre une cible en mouvement. – Walter