0

データのストリームを、実際には可変数の他の構造体をメンバーとして持つ構造体に直接キャストしようとしています。次に例を示します。

    struct player
    {
        double lastTimePlayed;
        double timeJoined;
    };

    struct team
    {
        uint32_t numberOfPlayers;
        player everyone[];
    };

それから私は電話します:

    team *myTeam = (cache_team*)get_stream();

これはある種のシリアライゼーションのように機能するはずです。ストリームが上記のように正確に構造化されていることはわかっていますが、numberOfPlayers が変数であるという問題があります。

私のストリームは、チームのプレーヤー数を表す 4 バイトで始まり、各プレーヤーが含まれます (この場合、各プレーヤーには lastTimePlayed と timeJoined しかありません)。

投稿されたコードは機能しているようですが、デフォルトの代入コンストラクターとコピーコンストラクターのためにコンパイラーから警告が表示されますが、私の質問は、これを別の方法、より良い方法で行うことができるということです。

ところで、私のストリームは実際にはファイルへの直接マッピングであり、私の目標は構造をファイル自体であるかのように使用することです (その部分は適切に機能しています)。

4

3 に答える 3

0

uint32_t4バイトです。8 バイトで始まる場合は、uint64_t.

警告を取り除きたい場合は、デフォルトのコピーと割り当てをプライベートにすることができます:

struct team {
    // ...
private:
    team(const team &);
    team &operator=(const team &);
};

とにかくポインターですべてを渡したいと思うので、偶発的なコピーを防ぐことができます。

マップされたポインターを構造体にキャストするのがおそらく最も簡単な方法です。重要なことは、すべてが正しく並んでいることを確認することです。

于 2013-07-10T03:36:08.423 に答える
0

Visual Studio 2012 では、次のようになります。

warning C4200: nonstandard extension used : zero-sized array in struct/union
A structure or union contains an array with zero size.
Level-2 warning when compiling a C++ file and a Level-4 warning when compiling a C file.

これは正当なメッセージのようです。構造体を次のように変更することをお勧めします。

struct team
{
        uint32_t numberOfPlayers;
        player everyone[1];
};

このような定義は洗練されていませんが、結果は基本的に同じになります。C++ はインデックスの値をチェックしていません。大量のコードがこれを使用しています。

新しい開発では、可能な限り「配列サイズ違反」を避ける必要があります。このように外部構造を記述することは許容されます。

于 2013-07-10T04:29:24.287 に答える