# 序列复合
IDL 序列复合类型指结构类序列、别名序列。例如:
(不支持枚举类型、序列类型、数组类型作为序列的定义类型)
//IDL
struct UserDataType
{
//结构体类型序列
sequence<S> seqS;
//聚合体类型序列
sequence<U> seqU;
//别名序列
sequence<myString> seqstr;
};
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
映射为:
//C++
struct UserDataType {
UserDataType();
UserDataType(const UserDataType &IDL_s);
~UserDataType();
UserDataType& operator= (const UserDataType &IDL_s);
sequence<S> seqS;
sequence<U> seqU;
sequence<myString> seqstr;
};
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
# IDL 定义示例
接口定义语言(IDL)字符串类型在 idl 文档中定义(以结构体为例):
typedef string myString;
struct S{
long l;
string str;
};
union U switch(long){
case 1: short s;
default: long l;
};
struct UserDataType{
sequence<S> seqS;
sequence<U> seqU;
sequence<myString> seqstr;
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 代码示例
生成测试用例后在 pub.cpp 中创建数据样本后添加赋值语句:
/* 6. 创建一个数据样本 */
/* 建议:该数据为new出来的,使用后用户需要调用delete_data进行释放内存*/
instance = UserDataTypeTypeSupport::create_data();
char str0[10] = "seqdata0";
char str1[10] = "seqdata1";
instance->seqdata.ensure_length(2, 2);
instance->seqdata[0].l = 1;
strcpy(instance->seqdata[0].str, str0);
instance->seqdata[1].l = 2;
strcpy(instance->seqdata[1].str, str1);
instance->seqU.ensure_length(2, 2);
instance->seqU[0].__d = 1;
instance->seqU[0].s(10);
instance->seqU[1].__d = 2;
instance->seqU[1].l(100);
char str2[10] = "seqstr";
instance->seqstr.ensure_length(1, 1);
//赋值前申请空间
instance->seqstr[0] = new char[10];
strcpy(instance->seqstr[0], str2);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 数据收发示例:
图 1 为使用 IDL 定义示例 中结构体生成的测试 demo,在 Windows 系统上启动发布端、在 Linux 系统启动订阅端后数据收发情况。
图中标号 1 为订阅端接收到发布端一次完整数据的情况显示。
图 1 序列复合类型数据收发示例(Windows->Linux)
图 2 为使用 IDL 定义示例 中结构体生成的测试 demo,在 Windows 系统上启动订阅端、在 Linux 系统启动发布端后数据收发情况。
图中标号 1 为订阅端接收到发布端一次完整数据的情况显示。
图 2 序列复合类型数据收发示例(Linux -> Windows)