首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从OpenDDS publisher传递复杂结构

从OpenDDS publisher传递复杂结构
EN

Stack Overflow用户
提问于 2014-10-09 20:26:48
回答 1查看 399关注 0票数 2

我有下面的idl结构。我想用opendds发布它

代码语言:javascript
复制
#pragma DCPS_DATA_TYPE "B::CData"
#pragma DCPS_DATA_KEY "B::CData id"


module B { 

    struct Quote {
        string skit_name;
        string episode_name;     
        string line;
    };

    struct CData{
        long id;
        Quote payload;
    };
};

我已经用java编写了发布者和订阅者。但在发布和订阅上述主题时,JVM会崩溃。

有人知道这件事吗?

下面是公共主题的java代码

代码语言:javascript
复制
public static void main(String[] args) {

    DomainParticipantFactory dpf =
    TheParticipantFactory.WithArgs(new StringSeqHolder(args));
    if (dpf == null) {
    System.err.println ("Domain Participant Factory not found");
    return;
    }
    final int DOMAIN_ID = 42;
    DomainParticipant dp = dpf.create_participant(DOMAIN_ID,
    PARTICIPANT_QOS_DEFAULT.get(), null, DEFAULT_STATUS_MASK.value);
    if (dp == null) {
    System.err.println ("Domain Participant creation failed");
    return;
    }


    CDataTypeSupportImpl servant = new CDataTypeSupportImpl();

    if (servant.register_type(dp, "") != RETCODE_OK.value) {
    System.err.println ("register_type failed");
    return;
    }


    Topic top = dp.create_topic("data",
    servant.get_type_name(),
    TOPIC_QOS_DEFAULT.get(), null,
    DEFAULT_STATUS_MASK.value);


    Publisher pub = dp.create_publisher(
    PUBLISHER_QOS_DEFAULT.get(),
    null,
    DEFAULT_STATUS_MASK.value);




    DataWriter dw = pub.create_datawriter(
    top, DATAWRITER_QOS_DEFAULT.get(), null, DEFAULT_STATUS_MASK.value);


    CDataDataWriter mdw = CDataDataWriterHelper.narrow(dw);
    CData cData=new CData();
    int handle = mdw.register(cData);

//    above statement crashes the jvm   

    int ret = mdw.write(msg, handle);

}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-11-28 20:50:50

可以使用openDDS传递复杂的结构

您需要像这样定义复杂的结构idl

代码语言:javascript
复制
module B { 
  typedef struct Quote {
    string skit_name;
    string episode_name;     
    string line;
  } QuoteData;

  @topic
  struct CData {
    @key long id;
    QuoteData payload;
  };
};

在接收数据时,您需要为复杂的data type.In情况预先分配内存

首先,我们将为以下对象分配内存

然后为其分配内存

..。

在我的例子中,我使用的是Java语言中的openDDS。Java语言中的openDDS使用本地库i.e.dll或lib,这些库是在编译openDDS和ACEWrappers之后生成的。

因为我没有为复杂的对象预先分配内存,所以JVM崩溃了。我只传递了CData对象。当我第一次创建QuoteData对象时,之后又创建了CData对象,它工作得很好。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26278422

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档