OpenDDS IDL 序列类型

Posted

技术标签:

【中文标题】OpenDDS IDL 序列类型【英文标题】:OpenDDS IDL Sequence type 【发布时间】:2020-10-06 21:21:13 【问题描述】:

我正在尝试使用以下 IDL 发布视频帧:

typedef sequence<octet> Pixels;
module message 
   @topic
   struct Image 
      int width;
      int height;
      int bytesPerPixel;
      Pixels  data;
;

我还想发送 2 个图像数据序列(例如,原始和过滤)。除了声明“Pixels data2”,可以将容器序列化为数组吗? typedef sequence&lt;octet&gt; Pixels[2] 给出错误。

【问题讨论】:

int 不是有效的 IDL 类型。整数类型是short(16 位)、long(32 位)、long long(64 位)以及这三个版本的unsigned 在将ints 转换为unsigned shorts 并添加缺少的大括号后,IDL 编译器将接受 IDL。您遇到了什么样的错误? 【参考方案1】:

好的,所以我把这个 IDL 给了opendds_idl

typedef sequence<octet> Pixels[2];
module message 
  @topic
  struct Image 
    unsigned short width;
    unsigned short height;
    unsigned short bytesPerPixel;
    Pixels data;
  ;
;

它接受了它:

opendds_idl --syntax-only test.idl                                                    
processing test.idl

但是我决定尝试用它构建一个库,以防生成的代码错误,这似乎是真的。

testTypeSupportImpl.cpp: In function ‘bool OpenDDS::DCPS::gen_skip_over(OpenDDS::DCPS::Serializer&, Pixels_forany*)’:
testTypeSupportImpl.cpp:83:41: error: ‘sequence’ does not name a type; did you mean ‘servent’?
     if (!gen_skip_over(ser, static_cast<sequence*>(0))) return false;

以下还有其他错误。似乎我们不支持同时对数组和序列进行类型定义。用两个作品替换 typedef:

typedef sequence<octet> PixelSeq;
typedef PixelSeq Pixels[2];

【讨论】:

上游报告了这个,见github.com/objectcomputing/OpenDDS/issues/1931 没错,这就是我在构建库时遇到的错误。谢谢,现在可以使用了!

以上是关于OpenDDS IDL 序列类型的主要内容,如果未能解决你的问题,请参考以下文章

OpenDDS - 从单个 IDL 结构创建多个主题

opendds TAO_IDL_GEN、OpenDDS_XML_QOS_XSC_Generation 和其他跳过的包

tao_idl -Gstl 不映射 std::string

openDDS通信过程中出现异常: (1388|2978735184) ERROR: TransportReactorTask::svc caught exception

OpenDDS 和发布者存在通知

OpenDDS 中的哪个库包含“OpenDDS::DCPS::operator<<”?