Hi So, trying to understand what is happening.
using capnp.exe (32bit) in capnproto-tools-win32-0.8.0, message can be read correctly. capnp.exe decode sparse4d.capnp Dir4D < myoutput.bin By looking at hex dump of the message file, it looks like a proper message format. So, writing new message is okay but reading it is not working properly. Using capnproto-0.8.0 built with VS2017/x64 , and create a new message, save it to a file, and then reading it by my program fails. Since all happens when I do message.getRoot<Dir4D>(), this "Premature EOF" situation happens inside capnp library. Is there any way to fix this? or to narrow down what is wrong? Thank you. 2021年2月16日火曜日 4:56:44 UTC+9 [email protected]: > Hello > > I have been learning this wonderful software. > So I have been looking for an opportunity to use capnproto for my project, > and now I have it but I need to use it with MSVC 2017(recently updated to > latest version 15.9.33), x64. > I only need serialization and no need for RPC or async. > This is my very first time posting a message to this community, please let > me know if I'm not doing right here. > > I have a schema whose basic construct is List of List of struct ( x,y > points in 4d expressed by two level lists). Second level will have a few > hundreds of entries and first level will have lots of entries. > And I am now stuck with a issue. If I put many entries in either of lists > (more than a few hundreds) and write that to a file, then when I read the > message, I get exception like this: > Any help would be very appreciated. > > printSparseDir4D: std::exception: kj\io.c++:53: failed: expected n >= > minBytes; Premature EOF > stack: 7ff672faac46 7ff672fa3fd6 7ff672fa2de5 7ff672fa1308 7ff672fb15d3 > 7ffc1aa97c23 7ffc1b18d720 > > Now I found that writing 4 entries in first level, two entries in second > level (two x,y points each in 4 frames), I get the same error. > > I'm putting my schema and my read/write code below. I'm using these codes > with capnproto0.8.0. But actually this schema is a little striped version > than the one I want to use. When I used that a little more complex schema, > I faced similar issue with capnproto 0.7.0 and 0.8.0. > > I built capnproto following the steps in the website, had to skip > heavy-tests project and kj-async (0.8.0), hoping the build was ok. > > Is there anything missing or done wrong? > It would be very much appreciated for any help. > Thank you. > > > sparse4d.capnp : > > # unique file ID, generated by `capnp id` > @0xae7dda29a38d355f; > > struct Sparse4DHeader { > tSize @0 :Int32; > zSize @1 :Int32; > ySize @2 :Int32; > xSize @3 :Int32; > } > > struct Dir4D { > header @0 :Sparse4DHeader; > planes @1 :List(SparsePlane); > > struct SparsePlane { > t @0 :UInt16; > z @1 :UInt16; > points @2 :List(Point); > } > } > > struct Point { > x @0 :UInt16; > y @1 :UInt16; > intensity @2 :Float32; > } > > > And read/write code: > > /** > * Copyright (c) 2021 ASTOM R&D > * Author: Yojiro Nobukuni > */ > //#include "pch.h" > > #include "../sparse4d.capnp.h" > #include <capnp/message.h> > #include <capnp/serialize-packed.h> > #include <iostream> > #include <ios> > > #include <sys/types.h> > #include <sys/stat.h> > #include <fcntl.h> > //#include <unistd.h> > > /** > * g++ writer.cpp photodeco_kernel.capnp.c++ -o writer -lcapnp -lkj > * ./writer > test.message > */ > > /** > * Write PhotodecoKernel message to fd > * @param int fd fd to read message in > */ > void writeSparse4D(int fd, unsigned int nofPlanes, unsigned int nofPoints, > bool packed) > { > ::capnp::MallocMessageBuilder message; > > auto dir4d = message.initRoot<Dir4D>(); > auto header = dir4d.initHeader(); > header.setTSize(7); > header.setZSize(7); > header.setXSize(7); > header.setYSize(7); > > auto planes = dir4d.initPlanes(nofPlanes); > for (auto plane : planes) { > plane.setT(9); > plane.setZ(8); > auto points = plane.initPoints(nofPoints); > #if 0 > // This one or the other one in #else block, same behavior. > for (unsigned int i = 0; i < nofPoints; i++) { > points[i].setX(1); > points[i].setY(2); > points[i].setIntensity(3); > } > #else > for (auto p : points) { > p.setX(1); > p.setY(2); > p.setIntensity(3); > } > #endif > } > > try { > if (packed) > writePackedMessageToFd(fd, message); > else > writeMessageToFd(fd, message); > } > catch (std::exception& e) { > std::cout << "writeSparse4D: std::exception: " << e.what() << std::endl; > return; > } > } > > > /** > * Print PhotodecoKernerl kernel in text > * @param PhotodecoKernel::Reader kernel > */ > void printDir4D(Dir4D::Reader dir4d, bool printPoints) > { > auto header = dir4d.getHeader(); > std::cout << " sizes[T,Z,Y,X] = " > << header.getTSize() << ", " << header.getZSize() << ", " << > header.getYSize() << ", " << header.getXSize() << ", " > << std::endl; > //std::cout << " nofPoints = " << header.getNofPoints() << std::endl; > > if (!printPoints) return; > > size_t nofPoints = 0; > auto planes = dir4d.getPlanes(); > for (auto plane : planes) { > const auto t = plane.getT(); > const auto z = plane.getZ(); > std::cout << "plane(t,z): " << t << ", " << z << std::endl; > for (auto p : plane.getPoints()) { > std::cout << t << ", " << z << ", " << p.getY() << ", " << p.getX() << ", > " << p.getIntensity() << std::endl; > nofPoints++; > } > } > > std::cout << "Total nof KernelPoints = " << nofPoints << std::endl; > } > > /** > * Read PhotodecoKernerl message from fd and print it in text > * @param int fd > * @param bool packed > */ > void printSparseDir4D(int fd, bool printPoints, bool packed) > { > std::cout << "printSparseDir4D" << std::endl; > > // readerOptions for reading message. > capnp::ReaderOptions readerOptions; > readerOptions.traversalLimitInWords = 1000 * 1000 * 1000 * > readerOptions.traversalLimitInWords; > //readerOptions.nestingLimit; > > ::capnp::MessageReader *message; > try { > if (packed) > message = new ::capnp::PackedFdMessageReader(fd, readerOptions); > else > message = new ::capnp::StreamFdMessageReader(fd, readerOptions); > > auto dir4d = message->getRoot<Dir4D>(); > printDir4D(dir4d, printPoints); > } > catch (std::exception& e) { > std::cout << "printSparseDir4D: std::exception: " << e.what() << std::endl; > return; > } > > > delete message; > } > > > -- You received this message because you are subscribed to the Google Groups "Cap'n Proto" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To view this discussion on the web visit https://groups.google.com/d/msgid/capnproto/8d471b75-02ab-4c1a-b3ec-f6a928f675e7n%40googlegroups.com.
