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_t是 4 个字节。如果它以 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 回答
0

Scaryrawr 的解决方案和你的解决方案都可以解决问题,但我实际上是在寻找另一种方法。

事实上我确实找到了。我使用了 uint32_t everyPtr 而不是数组,然后我将使用 reinterpret_cast 将 uint32_t 转换为指针,如下所示:

player *entries = reinterpret_cast<player*>(&team->everyonePtr);

那么我的映射将按预期工作,我认为它比数组 [1] 甚至是空的更容易理解。谢谢你们。

于 2013-07-10T22:39:50.073 回答