将void void *转换为带有数组成员的结构

时间:2013-07-10 02:34:57

标签: c++ arrays casting struct void

我正在尝试直接将数据流转换为实际上具有可变数量的其他结构作为成员的结构。这是一个例子:

    struct player
    {
        double lastTimePlayed;
        double timeJoined;
    };

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

然后我打电话给:

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

这应该像某种序列化一样工作,我知道我的流的结构完全如上所示,但我有numberOfPlayers是变量的问题。

我的流以4个字节开始,表示团队的玩家数量,然后它包含每个玩家(在这种情况下,每个玩家只有lastTimePlayed和timeJoined)。

发布的代码似乎正在工作,我仍然会收到编译器的警告,因为默认的赋值和复制构造函数,但我的问题是它可以通过其他方式执行此操作,这是一种更好的方法。

BTW,我的流实际上是一个直接映射到文件,我的目标是使用该结构,就好像它是文件本身(该部分正常工作)。

3 个答案:

答案 0 :(得分:0)

uint32_t是4个字节。如果以8个字节开头,则需要uint64_t

如果您想摆脱警告,可以将默认副本和作业设为私有:

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

因为你可能想要通过指针传递一切,所以它可以防止意外复制。

将映射指针强制转换为struct可能是最简单的方法。最重要的是确保所有内容都正确排列。

答案 1 :(得分: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 ++没有检查索引的值。大量的代码正在使用它。

新开发应尽可能避免“数组大小违规”。以这种方式描述外部结构是可以接受的。

答案 2 :(得分:0)

两个scaryrawr的解决方案,你的解决方案,但我实际上正在寻找另一种方式。

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

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

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