Hi Shuo, Could you possibly provide a minimal self-contained test program that I'd actually be able to build and debug? It's hard to see what might be wrong just from the code snippets.
Incidentally, while this doesn't explain your problem, note that you don't need to pass Readers or Builders by pointer. The Reader and Builder types already behave as pointers themselves, so you should pass them by value. -Kenton On Thu, Jan 11, 2018 at 10:38 AM, <[email protected]> wrote: > I am trying to check whether the packed message is handled correctly. > The message was serialized using: > kj::VectorOutputStream output; > capnp::MallocMessageBuilder message; > typename msgT::Builder r1 = message.initRoot<msgT>(); > assign_function(&r1); > capnp::writePackedMessage(output, message); > serialized_size = output.getArray().size(); > And was deserialized using: > typename msgT::Reader r2; > kj::ArrayInputStream input(output.getArray()); > capnp::PackedMessageReader reader(input); > r2 = reader.getRoot<msgT>(); > It was then checked using: > capnp::AnyStruct::Reader left = r1.asReader(); > capnp::AnyStruct::Reader right = r2; > return left == right; > The message assign function is: > void capnproto::assign_function(RobotControl::Builder *r) { > auto states = r->initState(nested_iter); > for (int i = 0; i < nested_iter; i++) { > auto command = states[i].initRobotCommand(); > if (i%2 == 0) { > command.setMove(1); > } else { > command.setGrasp(1); > } > auto pose = states[i].initPose(); > auto pos = pose.initPos(); > auto ori = pose.initOri(); > pos.setX(static_cast<double>(i + 1.0)); > pos.setY(static_cast<double>(i + 1.0)); > pos.setZ(static_cast<double>(i + 1.0)); > ori.setX(static_cast<double>(i + 1.0)); > ori.setY(static_cast<double>(i + 1.0)); > ori.setZ(static_cast<double>(i + 1.0)); > ori.setW(static_cast<double>(i + 1.0)); > } > } > I also tried to print out r2, but it returned: > unknown file: Failure > C++ exception with description "capnp/layout.c++:2240: failed: expected > ref->kind() == WirePointer::LIST; Message contains non-list pointer where > list pointer was expected. > stack: 0x4e86bb 0x4dfb0b 0x611d71 0x60b375 0x5ee6f8 0x5ef090 0x5ef783 > 0x5f68ca 0x613349 0x60c1b7 0x5f5366 0x4dd3c8 0x7f84f1d6c830 0x4ddde9" > thrown in the test body. > The print function is: > void capnproto::print_function(RobotControl::Reader *r) { > auto states = r->getState(); > for (int i = 0; i < nested_iter; i++) { > auto command = states[i].getRobotCommand(); > if (i%2 == 0) { > std::cout << command.isMove() << std::endl; > } else { > std::cout << command.isGrasp() << std::endl; > } > auto pose = states[i].getPose(); > auto pos = pose.getPos(); > auto ori = pose.getOri(); > std::cout << pos.getX() << " " << pos.getY() << > " " << pos.getZ() << std::endl; > std::cout << ori.getX() << " " << ori.getY() << > " " << ori.getZ() << " " << ori.getW() << std::endl; > } > } > However, this test for simple scalar value message passed. > Can anyone help me with this? > > Best, > Shuo > > -- > 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]. > Visit this group at https://groups.google.com/group/capnproto. > -- 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]. Visit this group at https://groups.google.com/group/capnproto.
