Структура flatbuffers в union не работает (C ++) - PullRequest
2 голосов
/ 26 сентября 2019

Я пытаюсь начать использовать 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

Очевидно, что это не желаемый результат.Что я делаю не так?

1 Ответ

1 голос
/ 26 сентября 2019

Удалите & перед inFavNums, и оно будет работать.

CreateStruct - это шаблонная функция, которая, к сожалению, в данном случае означает, что она также будет брать указатели, не жалуясь на это.Было бы неплохо избежать этого, но это не так просто в C ++.

...