Я пытаюсь начать использовать Flatbuffers в C ++, но мне уже не удается написать и прочитать структуру в объединении.Я сократил свою исходную проблему до анонимного минимального примера.
Пример схемы (favorite.fbs
)
// favorite.fbs
struct FavoriteNumbers
{
first: uint8;
second: uint8;
third: uint8;
}
union Favorite
{ FavoriteNumbers }
table Data
{ favorite: Favorite; }
root_type Data;
Я скомпилировал схему, используя 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;
}
Я использую унарный +
для принудительного числового вывода вместо символов . Ответ на другой вопрос здесь, на StackOverflow сказал мне, что я должен был использовать CreateStruct
, чтобы достичь того, чего я хочу.Я скомпилировал код, используя g ++ 9.1.0 (от 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
Очевидно, что это не желаемый результат.Что я делаю не так?