1. 程式人生 > >喚起那些年你對IDL的記憶(二)

喚起那些年你對IDL的記憶(二)

上一節喚起那些年你對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