联合中的 Flatbuffers 结构不起作用 (C++)
Flatbuffers struct in union not working (C++)
我正在尝试使用 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. 告诉我我必须使用 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
显然这不是想要的结果。我做错了什么?
去掉inFavNums
前面的&
就可以了
CreateStruct
是一个模板函数,不幸的是,在这种情况下,这意味着它也会接受指针而不抱怨它。最好避免这种情况,但这在 C++ 中并不那么容易。
我正在尝试使用 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. 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
显然这不是想要的结果。我做错了什么?
去掉inFavNums
前面的&
就可以了
CreateStruct
是一个模板函数,不幸的是,在这种情况下,这意味着它也会接受指针而不抱怨它。最好避免这种情况,但这在 C++ 中并不那么容易。