【问题标题】:Flatbuffers struct in union not working (C++)联合中的 Flatbuffers 结构不起作用(C++)
【发布时间】:2019-09-26 08:33:33
【问题描述】:

我正在尝试在 C++ 中使用 Flatbuffers,但我已经无法在联合中写入和读取结构。我已将最初的问题简化为一个匿名的最小示例。

示例架构 (favorite.fbs)

// favorite.fbs
struct FavoriteNumbers
{
    first: uint8;
    second: uint8;
    third: uint8;
}

union Favorite
{ FavoriteNumbers }

table Data
{ favorite: Favorite; }

root_type Data;

我使用从release page 下载的 Flatbuffers 1.11.0 编译了架构(我在 Windows 上,为了安全起见,我使用了预编译的二进制文件)。

flatc --cpp favorite.fbs

这会生成文件favorite_generated.h。

示例代码 (fav.cpp)

#include <iostream>
#include "favorite_generated.h"

int main(int, char**)
{
    using namespace flatbuffers;
    FlatBufferBuilder builder;

    // prepare favorite numbers and write them to the buffer
    FavoriteNumbers inFavNums(17, 42, 7);
    auto inFav{builder.CreateStruct(&inFavNums)};
    auto inData{CreateData(builder, Favorite_FavoriteNumbers, inFav.Union())};
    builder.Finish(inData);

    // output original numbers from struct used to write (just to be safe)
    std::cout << "favorite numbers written: "
        << +inFavNums.first() << ", "
        << +inFavNums.second() << ", "
        << +inFavNums.third() << std::endl;

    // output final buffer size
    std::cout << builder.GetSize() << " B written" << std::endl;

    // read from the buffer just created
    auto outData{GetData(builder.GetBufferPointer())};
    auto outFavNums{outData->favorite_as_FavoriteNumbers()};

    // output read numbers
    std::cout << "favorite numbers read: "
        << +outFavNums->first() << ", "
        << +outFavNums->second() << ", "
        << +outFavNums->third() << std::endl;

    return 0;
}

我使用一元 + 到 force numerical output instead of characters。 An answer to another question here on StackOverflow 告诉我我必须使用 CreateStruct 来实现我想要的。我使用 g++ 9.1.0 (by MSYS2)编译了代码。

g++ -std=c++17 -Ilib/flatbuffers/include fav.cpp -o main.exe

这会生成文件main.exe。

输出

favorite numbers written: 17, 42, 7
32 B written
favorite numbers read: 189, 253, 34

显然这不是我们想要的结果。我做错了什么?

【问题讨论】:

  • 看起来即使只有一个 union 成员,flatbuffers 也会生成带有“NONE”和“FavoriteNumbers”状态的标记联合。
  • @MarekR 为什么不呢?请记住,favorite.fbs 不是 C++ 代码,而是被翻译成某些 C++ 标头的东西。而一元 + 完全没问题,并且是一种将 8 位整数打印为数字而不是 ASCII 值的标准方式(尽管对毫无戒心的读者来说显然令人惊讶)。 (编辑:保持评论,以防未来的读者错过同样的事情)
  • @Swift-FridayPie 是的,确实如此,但是你想用这个告诉我什么?
  • @Marek R 为什么是 char 到 int 的提升?
  • @MaxLanghof 抱歉错过了第一段代码不是 C/C++ :/.

标签: c++ flatbuffers


【解决方案1】:

去掉inFavNums前面的&amp;就可以了。

CreateStruct 是一个模板函数,可悲的是,在这种情况下,这意味着它也会接受指针而不抱怨它。最好避免这种情况,但这在 C++ 中并不容易。

【讨论】:

  • 它实际上是可行的,尤其是在生成代码或库的情况下
猜你喜欢
  • 2018-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多