2015-11-02 115 views
0

我正在開發一個應用程序來發送和接收數據包。向C++向量添加新字段

我正在使用std::vector類(首先我開始在數組中創建數據包,如果您更好地建議,我會公開更改該方法)。

我找到了this智能功能將任何const char*添加到vector對象。但我想做一個像{.. , ..}之間添加它們,就像我可以在C#中做的那樣。這裏的一個例子:

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 

它可能在c + +?我知道在C#中你可以做這樣的事情。

編輯:

一種可能的解決方案是:

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()); 

隨着一點點函數寫少:

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

你的意思是'std :: vector'? – juanchopanza

+0

是@juanchopanza – ars1614

+0

你確定最後一行中的數字沒有被解析,就好像它們是「int」一樣嗎? – BinarySpark

回答

0

當然。

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

試試這個。

+0

不知道這是否會將'int's添加到'char *'向量雖然... –

+0

我不習慣在C++中編寫很多代碼,所以我複製粘貼代碼在我的程序中,與T得到一個模棱兩可的模板參數錯誤。我添加十六進制值,所以我不知道是否字符類型是最佳的(在C#中我使用字節數組) – ars1614

+0

似乎我錯了問題... – iDingDong

3

您的vector<char*>只包含指向char類型變量的指針。它不包含任何數據。這是很危險的,因爲如果指向的對象超出範圍,指針可能會變得懸而未決。

更好地使用數據類型作爲您的vector的元素類型。如果要存儲字符串,請使用std::vector<std::string>。如果要保留諸如char[4]之類的對象,請使用std::vetor<std::array<char,4>>。如果要保存任意長度的字節數組,請使用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

我明白了,我會做的。謝謝 – ars1614

+0

我試過這個,但它似乎不起作用。你將如何加入兩個arrais? – ars1614

+0

你嘗試了什麼,什麼不起作用?更加詳細一些。此外,你還在繼續改變你的問題 - 這很糟糕,因爲很難擊中移動目標。 – Walter