当前位置 博文首页 > 流浪若相惜的专栏:唤起那些年你对IDL的记忆(二)

    流浪若相惜的专栏:唤起那些年你对IDL的记忆(二)

    作者:[db:作者] 时间:2021-07-31 21:11

    上一节唤起那些年你对IDL的记忆(一),我们已经对IDL的基础–数组有了比较深的说明,之所以我在写第一篇时复制了大量的IDL-Help的说明,目的是为了让跟我一样初学IDL的同学们能记住一点,就是不要脱离了IDL-Help去学习IDL。其实,说白了任何一种语言的学习,并不是说你获得了一本内容非常丰富的书,你把它看了几遍,你就掌握了这门语言,除了你要不断的书写程序,还有一点比较重要的就是学会查看API。
    因此,学会如何查看IDL-Help,并且有意识的遇到不懂或者忘记的,就去看Help,个人觉得这是快速学习任何一种语言最有效,也是最快速的方法。

    字符串

    字符串创建

    创建一个字符串,可以使用“”或者‘’

    IDL> s1="abdsde"
    IDL> s2=strarr(6)
    IDL> help,s2
    S2              STRING    = Array[6]
    IDL> s3="11
    IDL> print,s3
           9
    IDL> ;"代表8进制,输出是十进制:9
    IDL> str="abaed""
    IDL> print,str
    abaed"
    IDL> str="abaed'"
    IDL> print,str
    abaed'
    IDL> 

    字符串连接

    字符串连接直接用“+”

    IDL> print,s1
    abdsde
    IDL> print,str
    abaed'
    IDL> s3=s1+str
    IDL> print,s3
    abdsdeabaed'

    字符串转换

    使用类型转换函数可以将字符串转换成其它数据类型。字符串可以直接转换成字节类型(byte),而整形、浮点型等其它类型不允许转换,需要先将字符串转换成字节类型,再转为其它类型。逆变换也是如此

    IDL> print,s1
    abdsde
    IDL> print,byte(s1)
      97  98 100 115 100 101
    IDL> print,fix(s1)
    % Type conversion error: Unable to convert given STRING to Integer.
    % Detected at: $MAIN$          
           0
    IDL> print,fix(byte(s1))
          97      98     100     115     100     101
    IDL> print,string[97,98,100,115,100,101]
    % Variable is undefined: STRING.
    % Execution halted at: $MAIN$          
    IDL> print,string([97,98,100,115,100,101])
          97       98      100      115      100      101
    IDL> print,string(byte([97,98,100,115,100,101]))
    abdsde

    这里实际上转换的依据是ASCII码,附上一张ASCII码表
    这里写图片描述
    图1 ASCII码表

    处理函数

    在这里只附上一张处理函数表方便常用的字符串处理函数查找,更加详细的介绍请自行查阅IDL-Help:
    这里写图片描述
    图2字符串处理函数表

    特殊字符

    IDL支持绝大多数的ASCII码显示输出,下表所列的特殊字符无法打印输出
    这里写图片描述
    图3 特殊字符

    结构体

    IDL-Help给采购员Structure数据结构的定义如下:
    A compound data type that contains pairs of tags and values, where the values can be of any data type. Once a structure is created, neither the tags nor the data types of the values associated with the tags can be changed.

    董老师的书中是这样说明结构体的:
    结构体是一种复合变量,它可以是变量、数组或结构等类型的集合,通常用于程序参数传递或数据交换。
    其实,说白了这就是一种数据结构。
    结构体可以分为:命名结构体和匿名结构体

    命名结构体

    创建用{},同时赋予结构体名字。
    格式:{name,tag1:value1,tag2,value2…}

    IDL> help,{str1,a:1,b:2}
    ** Structure STR1, 2 tags, length=4, data length=4:
       A               INT              1
       B               INT              2

    命名结构体支持结构体继承,例如:

    IDL> struct2={str2,inherits str1,c:3}
    IDL> help,struct2,/structure
    ** Structure STR2, 3 tags, length=6, data length=6:
       A               INT              0
       B               INT              0
       C               INT              3

    匿名结构体

    IDL> str={name:'ergou',sex:'女',shcool:"SDAU"}
    IDL> HELP,str
    ** Structure <a3a77a0>, 3 tags, length=48, data length=48, refs=1:
       NAME            STRING    'ergou'
       SEX             STRING    '?'
       SHCOOL          STRING    'SDAU'

    注:这里有个问题就是汉字不识别,编码设置中没有GB2312编码方式

    访问结构体

    通过“变量名.成员名”或者“变量名.(index)”

    IDL> help,str
    ** Structure <a3a77a0>, 3 tags, length=48, data length=48, refs=1:
       NAME            STRING    'ergou'
       SEX             STRING    '?'
       SHCOOL          STRING    'SDAU'
    IDL> 
    IDL> print,str.Name
    ergou
    IDL> print,str.(0)
    ergou

    结构体操作函数

    这里写图片描述
    图4 结构体操作函数
    遍历结构体成员

    PRO traverse_struct
      struct1={a:1,b:2,c:3,d:4}
      ;获取成员数量
      tagNumber=N_Tags(struct1)
      ;获取成员名字
      tagName=Tag_Names(struct1)
      FOR i=0,tagNumber-1 DO BEGIN
        PRINT,'Name:',tagName[i],'Value:',struct1.(i)
      ENDFOR
    END

    遍历结果:

    Name:AValue:       1
    Name:BValue:       2
    Name:CValue:       3
    Name:DValue:       4
    cs