4

次のクラスがあります。

名前空間メッセージ。

struct BBox {
 xmin:float;
 xmax:float;
 ymin:float;
 ymax:float;
}

table msg {
  key:string;
  boxes: [BBox];
}

root_type Message;

オブジェクトを作成するには、次のようなことを行います

b = flatbuffers.Builder(0)
msg.msgStart(b)
msg.msgAddKey(b, b.CreateString(key))

v = flatbuffers.Builder(0)
size = len(boxes)
msg.msgBoxesVector(v, size)
for elem in boxes:
    xmin, ymin, xmax, ymax = elem
    BBox.CreateBBox(v, xmin, xmax, ymin, ymax)
boxes = v.EndVector(size)
msg.msgAddBoxes(b, boxes)
obj = msg.msgEnd(b)
b.Finish(obj)

エラーはスローされません

しかし、結果を表示しようとすると、キーは良いのですが、ベクトルとコンテンツのサイズが間違っています

rep = msg.msg.GetRootAsmsg(bytearray(b.Output()), 0)
print rep.BoxesLength()  # give me 4 instead of 1 
for i in range(rep.BoxesLength()):
    print rep.Boxes(i).Xmin(),  rep.Boxes(i).Ymin()
    print rep.Boxes(i).Xmax(),  rep.Boxes(i).Ymax()
4

2 に答える 2

5

Python ポートが十分なエラー チェックを行っていないという未解決の問題があります: https://github.com/google/flatbuffers/issues/299

文字列とベクトルの作成は の前に行う必要がありmsgStartます。また、上記のコードは 1 つのバッファーから別のバッファーを参照するため、動作しbないため、 1 つの Builder オブジェクトのみを使用する必要があります ( のみを使用し、 を使用しないでください)。v

編集: ベクトル/文字列/テーブルの生成をネストしようとすると、Python 実装が正しくエラーを通知するようになりました。ただし、クロスバッファーオフセットはまだ検出できません。

于 2015-11-02T19:43:01.147 に答える