2011-09-14 5 views
0

これらの2つの関数は、QVectorをシリアル化しようとしています。私の上司は実装がQtに依存せず、QDataStreamがヘッダを前に付ける必要があるので、残念ながらQDataStreamを使用することはできません。だから、関数binToVectorから返されるベクトルは、サイズが0に等しいことを返しますが、要素が印刷されていれば元のベクトルと等しくなります。ベクトルが元の要素と等しい場合、返されるサイズはなぜゼロですか?これらのシリアル化関数は正常ですか?私はそれを実装するためにQt関数を使うことはできません.C++だけです。QVector size()はゼロサイズを返します

QByteArray vectorToBin(const QVector<qint32> & vec) 
{ 
    QByteArray result; 
    foreach(quint32 e, vec) { 
    char *src = reinterpret_cast<char*>(&e); 
    result.append(src, sizeof(qint32)); 
    } 
    return result; 
} 

QVector<qint32> binToVector(const QByteArray & bytes) 
{ 
    int size = sizeof(qint32); 
    QVector<qint32> result; 
    result.reserve(bytes.count()/size); 
    int j=0; 
    for(int i=0; i<bytes.count(); i+=size) { 
    memcpy(&result[j++], bytes.constData()+i, size); 
    } 
    return result; 
} 
+0

あなたの上司はQTを使わずにQTデータ構造をシリアライズしたいですか? – Puppy

+0

既にQVectorを使用しているため、実装はQtと独立していることはできません。そのヘッダーの問題がある場合は、前方宣言を試してください。 QDataStreamが書いていることは、基本的にホイールを改革することです。あなたの上司に車輪を再発明するかどうか聞いてください:)) – blueskin

+1

種類、@DeadMG。彼は*発生するデータをプロジェクトの現在の化身のQtデータ構造体に保存するようにシリアル化したいと考えています。 Qtのシリアライズフォーマットに結びつきたいと思っているのは、いつか特定のQtクラス以外のものを使うことにしたり、他の非Qtを使っているプロジェクトが同じシリアル化されたデータを使うことを望むなら。 –

答えて

6

あなたはストレージとして使用するクラスのためのメモリを割り当てますが、実際には、容器内の本当要素の数を変更しないQVector::reserveを呼んでいます。そのためにはQVector::resizeが必要です。標準のC++ vectorクラスも同じように動作します。スペースを事前に予約することで、今後のappendへの呼び出しを繰り返すことで、いつでもコンテナのストレージを再割り当てする必要がなくなります。

+0

ビンゴ!答えをありがとう。 –

関連する問題