2016-12-14 12 views
0

私はこの問題がコミュニティによって特定され、解決されるべきだと思っていましたが、間違ったキーワードで検索しているか、それほど難解です。ダイナミックサイズの構造体に使用するQt C++データコンテナはありますか?

問題は簡単です。動的データコンテナ(Vector、List、Queueなど)を定義する構造体を定義します。

#pragma pack(1) 

struct Example 
{ 
    int foo; 

    QVector<int> bar; 
}; 

私はこのベクトルに整数値を挿入(またはその他のQt/STLコンテナを取る)する必要があると私は、ファイルへの生データを書き込むためにバイト配列に、この構造体の内容をコピーします。 QVectorを指す普通のポインタであるため、

8 
8 

さて、これはおそらくです:

Example exstr; 
qDebug()<<sizeof(exstr); 
exstr.bar.push_back(12); 
exstr.bar.push_back(5); 
qDebug()<<sizeof(exstr); 

それは値が表示されます。

私が遭遇したことは、私は次のコードを記述する場合ということです連続したデータが必要ですが、動的にサイズ変更可能なデータコンテナ(これは構造体のサイズを変更する)であり、シリアル化しようとするとバイト単位でコンテンツを使用できます。

ご協力ありがとうございます。

+0

動的サイズのコンテナを出力する場合は、シリアル化ライブラリを使用するか、独自のロールを作成する必要があります。 – NathanOliver

+0

ベクトルのバイト数を知りたいですか?これはあなたが求めているのでしょうか? – CroCo

+0

@CroCoそれは私の原因を助けるが、私はまだシリアル化の問題があるので、完全に問題を解決することはありません。 しかし、誰かがコンテナに新しい要素を挿入するたびに "sizeof"の増加を見る方法を提案してくれれば、私は非常にうれしいです。 –

答えて

1

QDataStreamあなたはQtのデータ型の一部をシリアル化することができます:あなたはQVectorと正しい軌道に乗っているSerializing Qt Data Types

QDataStream stream(&file); // we will serialize the data into the file 
stream << your_qvector_obj; 
//... 
QVector<int> new_vec; 
stream >> new_vec; 
//... 
+0

答えとコードをありがとう、私はクラスでこのアイデアをラップし、このクラスのメソッドを持つ直列化ジョブそれは私が推測するトリックを行うだろう。 –

0

。 STLベクトルクラスも動作します。これらのクラスはどちらも連続したメモリに値を格納することが保証されています。

QVectorについて、あなたはこのようなものが必要です。STLベクトルの

memcpy (dest, bar.data(), bar.count() * sizeof (int)); 

を、あなたは最初の要素のアドレスを取る:どちらの場合も

memcpy (dest, &bar[0], bar.size() * sizeof (int)); 

を、 "DEST" でなければなりませんあなたがコピーしているデータを保持するのに十分な大きさ。ここでは例としてコピーを使用しています。データへのポインタが必要な場合、QVector :: dataは、STLベクトルの場合、最初の要素のアドレスがそれを提供することを示します。

関連する問題