2009-06-19 8 views
0

ヘッダー、トレーラー、および可変長のペイロードフィールドを持つパケットを作成する必要があります。私は私が手ベクトルワンセグ断層のメンバーにアクセスしようと全体の構造体のはsizeofは私を与えるとき可変サイズの構造体を作成するメソッド

struct a_struct{ 
hdr a_hdr; 
vector<unsigned int> a_vector; 
tr a_tr; 
}; 

:私の構造体は次のように設定されているので、これまでのところ私は、ペイロードのためのベクターを使用しています32(私はベクトルに約100の要素を追加した後。

が、これは良いアプローチですか?良いですか?

私は彼がchar型の配列を使用していた、と私は Variable Sized Struct C++ この記事を見つけましたしかし、ベクトルを使用して。

+1

を共有したいと思いました。どうやって構造体を作成してアクセスしていますか? – ralphtheninja

+1

ベクトルを使用しているため、パケットのメモリが連続していないことに注意してください。たとえば、あなたはそれを直列化せずに、それをmemcpyすることも、ワイヤ上に置くこともできません。 –

答えて

2

他のSOの回答で解決策をc固有であり、cアレイの特殊性に依存しているレイモンドさんのブログに文書化されている - とcでも、sizeof()は可変サイズの構造体の "真の"サイズを見つけるのに役立ちません。本質的に、それは不正行為であり、それはC++で必要ではない不正行為の一種です。

あなたがしていることは問題ありません。ワンセグ障害を回避するために、C++での任意の他のベクター、あなたと同じように、ベクターにアクセス:

a_struct a; 
for(int i = 0; i < 100; ++i) a.a_vector.push_back(i); 
cout << a.a_vector[22] << endl; // Prints 22 
+0

これは素晴らしいことです - 私はこのアプローチがうまくいくとは思わなかった。 – devin

+0

2つの宣言(c-structとhier)が異なることに注意してください。 – bill

5

ベクトル型が構造体にインライン展開されていても、ベクトル内にある唯一のメンバはポインタである可能性があります。ベクトルにメンバを追加しても、ベクトル型自体のサイズは増えませんが、それが指すメモリは増えます。そのため、メモリ内の構造体のサイズの大きさは決してわかりません。そのため、segフォルトが発生します。

通常、可変サイズの構造体を作成する場合、構造体の最後のメンバーとして配列を追加し、その長さを1に設定します。次に、実際に必要な構造体に余分なメモリを割り当てます構造を「拡張」するためにはsizeof()を使用します。これには、ほとんどの場合、構造体内に拡張された配列のサイズを詳述する余分なメンバーが付随しています。

1を使用する理由は、徹底的に

+0

それは意味があるので、逆参照できますか? – devin

1

私はboost..itで、この実装は、可変 長ペイロードを持っている...本当にきれいに見えました....

class msg_hdr_t 
{ 
    public: 
    std::size_t    len;  // Message length 
    unsigned int   priority;// Message priority 
    //!Returns the data buffer associated with this this message 
    void * data(){ return this+1; } // 
}; 

これは完全に非関連の質問にかもしれないが、あなたには、いくつかのより多くのコードを私たちに提供してくださいすることができます私は情報

関連する問題