结构体是由一批数据组合而成的结构型数据。组成结构型数据的每个数据称为结构型数据的“属性”(亦称之为“成员”),这些成员可以是变量、数组、字符串以及结构等类型数据。IDL中常用于函数返回值(PS:因为IDL中函数最多只能返回一个参数,因此当需要返回多个变量时,可以组合成一个变量作为返回值)。
注:属性名必须的命名规范必须和变量命名一致,不能含有汉字!
>>Pig = Create_struct(['名字','weight'],'来福',200,Name='Pelosi')
% CREATE_STRUCT: Illegal tag name: 名字.
% Execution halted at: $MAIN$
PS:我习惯matlab的用法,喜欢称之为“属性”,相对来说,“成员”更为贴切。
1. 创建结构体
IDL结构体包含两个结构体类型:命名结构体(署名结构体,typename)、匿名结构体。
1.1 直接创建
1.1.1 命名结构体
创建结构体时用大括号“{}”, 命名结构体创建之时需要赋予结构体名称。
创建格式:变量名={署名,属性1::值1,属性2:值2……}
>> ; 之所以称之为命名结构体,是因为代码中有一个名称'Dog',name和weight是结构体中的属性,属性后面是对应的属性值,两者用“:”连接
>>help,Pet ; 结构体Pet信息,名称DOG,2个成员变量(属性name、weight)及对应的属性值
** Structure DOG, 2 tags, length=32, data length=32:
NAME STRING '来福'
WEIGHT STRING '20Kg'
>>Pet.NAME ; 查看属性name属性值
来福
>>Pet.WEIGHT ; 查看属性weight的属性值
20Kg
>>Pet = {Pig,name:'Pelosi',weight:'200Kg'} ; 例子2
>>help,pet
** Structure PIG, 2 tags, length=32, data length=32:
NAME STRING 'Pelosi'
WEIGHT STRING '200Kg'
1.1.2 匿名结构体
与命名结构体相比,无需署名
创建格式:变量名={署名,属性1::值1,属性2:值2……}
>>Pig = {name:'Pelosi',weight:'200Kg'}
>>help,Pig
** Structure <34b4c630>, 2 tags, length=32, data length=32, refs=1:
NAME STRING 'Pelosi'
WEIGHT STRING '200Kg'
注:显示的时候,由于没有署名,所以显示的是存储的ID号。
1.2 利用函数创建结构体
1.2.1 Create_struct函数
可以利用Create_struct()函数创建结构体。
函数语法:
Result = CREATE_STRUCT( [Tag1, Values1, ..., Tagn, Valuesn] [, Structuresn] [, NAME=string])
Result = CREATE_STRUCT( [Tags, Values1, ..., Valuesn][, Structuresn] [, NAME=string])
其中参数name表示署名,例如创建一个Pig结构体(命名结构体和匿名结构体),具有name和weight属性
- 第1种函数用法创建结构体
>>Pig = Create_struct('name','来福','weight','20Kg',Name='Pelosi') ; 命名
>>help,Pig
** Structure PELOSI, 2 tags, length=32, data length=32:
NAME STRING '来福'
WEIGHT STRING '20Kg'
>>Pig = Create_struct('name','来福','weight','20Kg') ; 匿名
>>Pig
{
"NAME": "来福",
"WEIGHT": "20Kg"
}
- 第2种函数用法创建结构体
>>Pig = Create_struct(['name','weight'],'来福',200,Name='Pelosi')
>>Pig
{
"NAME": "来福",
"WEIGHT": " 200"
此外,Create_struct()函数还可以在原有的基础上链接现有的结构体。
>>Pig = Create_struct(['name','weight'],'来福',200,Name='Pelosi')
>>Pet = Create_struct(Pig,'country','USA')
>>help,Pig
** Structure PELOSI, 2 tags, length=32, data length=32:
NAME STRING '来福'
WEIGHT STRING ' 200'
>>help,Pet
** Structure <374499a0>, 3 tags, length=48, data length=48, refs=1:
NAME STRING '来福'
WEIGHT STRING ' 200'
COUNTRY STRING 'USA'
1.2.2 Replicate函数
也可以用Replicate()函数创建结构体,
语法:
Result = REPLICATE( Value, D1[, ..., D8] )
>>Name = REPLICATE('Hlz', 5, 5)
>>Name
Hlz Hlz Hlz Hlz Hlz
Hlz Hlz Hlz Hlz Hlz
Hlz Hlz Hlz Hlz Hlz
Hlz Hlz Hlz Hlz Hlz
Hlz Hlz Hlz Hlz Hlz
>>help,Name
NAME STRING = Array[5, 5]
>>Name = REPLICATE(Pig, 2, 2)
>>Name
[
{
"NAME": "来福",
"WEIGHT": " 200"
},
{
"NAME": "来福",
"WEIGHT": " 200"
},
{
"NAME": "来福",
"WEIGHT": " 200"
},
{
"NAME": "来福",
"WEIGHT": " 200"
}
]
>>help,name
NAME STRUCT = -> PELOSI Array[2, 2]
2 结构体操作
2.1 查看结构体
可以利用help函数、N_Tags()函数、Tag_Name()函数查看相关信息;
- help函数:查看结构体相关信息,最全显示
- N_Tags()函数:查看结构体属性(成员)个数
- Tag_Name()函数:显示结构体的属性名(成员名)
- .Tname:显示变量类型
- .typename:显示署名
>>Pig = Create_struct(['name','weight'],'来福',200,Name='Pelosi')
>>help,Pig
** Structure PELOSI, 2 tags, length=32, data length=32:
NAME STRING '来福'
WEIGHT STRING ' 200'
>>Print,N_tags(Pig)
>>Print,Tag_names(Pig)
NAME WEIGHT
>>Print,Pig.TNAME
STRUCT
>>Print,Pig.TYPENAME
PELOSI
可以利用“结构体.属性”或“结构体.(Tag_Index)”来查看属性值。
注:Tag_Index 是一个表达式,其结果被视为一个标签位置(具体某一个数),为了让 IDL 解析器理解这种情况,您必须将 Tag_Index 括在括号中。 这不是数组索引操作,因此在此上下文中不允许使用方括号 [ ]。
>>Pig = Create_struct(['name','weight','Country'],'来福',200,'USA',Name='Pelosi')
>>Pig.name
来福
>>Pig.(0)
来福
>>Pig.(0:1)
Pig.(0:1)
^
% Syntax error.
>>Pig.(0,1)
Pig.(0,1)
^
% Syntax error.
2.2 修改结构体
结构体一旦被创建,其属性(成员)变量的个数与类型将无法修改,赋值操作时结构体属性(成员)变量会自动类型转化。
>>Pig = Create_struct(['name','weight'],'来福',200,Name='Pelosi')
>>Pig
{
"NAME": "来福",
"WEIGHT": 200
}
>>Pig.NAME = '老妖婆'
>>Pig
{
"NAME": "老妖婆",
"WEIGHT": 200
>>Pig.NAME = 9
>>Pig
{
"NAME": " 9",
"WEIGHT": 200
}
>>Pig.NAME = Indgen(2)
% Expression must be a scalar in this context: <STRING
Array[2]>.
% Execution halted at: $MAIN$
分析:上述代码中,可以直接将原有的成员Name的值改为"老妖婆",但改为数字9的时候,自动变成字符串形式,改成数组类型的时候,程序报错。
3.3 新增属性
可以利用函数create_struct()新增属性(成员)。
>>Pig = Create_struct(['name','weight'],'来福',200,Name='Pelosi')
>>Pig2
{
"NAME": "来福",
"WEIGHT": 200,
"COUNTRY": "USA"
也可以利用结构体继承来新增属性(成员)。
>>Pig = Create_struct(['name','weight'],'来福',200,Name='Pelosi')
>>Pig2 = {Caiyingwen, inherits Pelosi}
>>Pig2
{
"NAME": "",
"WEIGHT": 0
}
>>Pig3 = Pig
>>Pig3
{
"NAME": "来福",
"WEIGHT": 200
不同于等号直接赋值,结构体“继承”只继承其属性(成员),为继承属性对应的值,相当于只赋值了表格的表头。
可以在继承的基础上,新增属性。
>>Pig = Create_struct(['name','weight'],'来福',200,Name='Pelosi')
>>Pig4 = {Caiyingwen1, inherits Pelosi, Conntry:'中国台湾省'}
>>pig4
{
"NAME": "",
"WEIGHT": 0,
"CONNTRY": "中国台湾省"
3.3 删除属性
水平有限,暂时未想到好的方法待以后补充。
不足之处,敬请斧正!
路漫漫其修远兮,吾将上下而求索