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