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.

Reply via email to