结构体是由一批数据组合而成的结构型数据。组成结构型数据的每个数据称为结构型数据的“属性”(亦称之为“成员”),这些成员可以是变量、数组、字符串以及结构等类型数据。IDL中常用于函数返回值(PS:因为IDL中函数最多只能返回一个参数,因此当需要返回多个变量时,可以组合成一个变量作为返回值)。
注:属性名必须的命名规范必须和变量命名一致,不能含有汉字!
- >>Pig = Create_struct(['名字','weight'],'来福',200,Name='Pelosi')
- % CREATE_STRUCT: Illegal tag name: 名字.
- % Execution halted at: $MAIN$
PS:我习惯matlab的用法,喜欢称之为“属性”,相对来说,“成员”更为贴切。
IDL结构体包含两个结构体类型:命名结构体(署名结构体,typename)、匿名结构体。
创建结构体时用大括号“{}”, 命名结构体创建之时需要赋予结构体名称。
创建格式:变量名={署名,属性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:值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号。
可以利用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属性
- >>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"
- }
- >>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'
也可以用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]
可以利用help函数、N_Tags()函数、Tag_Name()函数查看相关信息;
- >>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.
结构体一旦被创建,其属性(成员)变量的个数与类型将无法修改,赋值操作时结构体属性(成员)变量会自动类型转化。
- >>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:
- Array[2]>.
- % Execution halted at: $MAIN$
分析:上述代码中,可以直接将原有的成员Name的值改为"老妖婆",但改为数字9的时候,自动变成字符串形式,改成数组类型的时候,程序报错。
可以利用函数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": "中国台湾省"
水平有限,暂时未想到好的方法待以后补充。
不足之处,敬请斧正!
路漫漫其修远兮,吾将上下而求索