IDL Testing Plan Section 2
從語言的角度
2. 從語言的角度
由於IDL提供語言的功能,所以測試可以由程式語言的角度來看其功能
特性。而由一般程式語言的角度來看IDL又可以分成:
IDL的語言形式與FORTRAN語言較為相近,是一種高階形式的程式語
言。可是他也提供一般語言該有的資料類別、運算子與指令、檔案資料
的輸出與輸入、副程式與函數等等。
2.1. 資料類別
IDL的資料類別有八種:
- byte
- integer
- long word
- floating
- double
- complex
- structure
IDL提供了一般語言該有的資料類別,這一點與Matlab是相當不同的,
因為Matlab的基本資料類別為矩陣,雖說也有整數、實數、複數、字
串等資料類別,但是所有變數均以矩陣的形態存在。以下是一個簡單
的測試例子:
in IDL:
IDL> a=123
IDL> print,a
123
IDL> b=[1,2,3]
IDL> print,b
1 2 3
IDL> c="the string"
IDL> print,c
the string
IDL> help,a,b,c
A INT = 123
B INT = Array(3)
C STRING = 'the string'
IDL> print,c(2)
% Attempt to subscript C with is out of range.
% Execution halted at $MAIN$ .
in Matlab:
>> a=123
a =
123
>> b=[1,2,3]
b =
1 2 3
>> c='the string'
c =
the string
>> whos
Name Size Elements Bytes Density Complex
a 1 by 1 1 8 Full No
b 1 by 3 3 24 Full No
c 1 by 10 10 80 Full No
Grand total is 14 elements using 112 bytes
>> c(2)
ans =
h
2.2. 運算子與表示式
IDL中變數之間可以利用運算子與函數等,結合成複雜的表示式格式格
式。IDL中運算子的種類有幾類:
這些運算子的用法基本上與其他程式語言沒有太大的不同。有一點不同
的是在定義真假值上,IDL在不同的資料類別定義真假值為:
- 整數上定義奇數為真,偶數為假。
- 實數及複數上定義非零值為真,零值為假。複數中的虛數部份不算。
- 字串上定義非空字串為真,空字串為假。
在科學計算程式的功能中,數學運算的能力最受重識,IDL的數學運算
主要以Numerical Recipes為主。IDL的陣列儲存方式剛好與矩陣的儲存
方式相反,所以在IDL中要做矩陣的運算,要先將陣列轉置後再行運算
,並將結果轉置後才是答案,而Matlab因為所有的資料均以矩陣的形式
儲存,所以在做矩陣的運算時不用如此麻煩。以下是一個簡單的測試例
子:
IDL> matrix1=[[1,2,3],[2,-1,2]]
IDL> matrix2=[[1,3],[0,1],[1,1]]
IDL> print,matrix1
1 2 3
2 -1 2
IDL> print,matrix2
1 3
0 1
1 1
IDL> result=transpose(transpose(matrix1) # transpose(matrix2))
IDL> print,result
4 8
4 7
IDL> result=matrix1 # matrix2
IDL> print,result
7 -1 9
2 -1 2
3 1 5
2.3. 指令集
一般程式語言的指令集應至少包含有資料的指定、迴圈控制、狀況判斷
、函數的定義與呼叫,IDL的指令集亦包含了一般語言最基本的形態:
- assignment
- Block
- Common Block Definition
- Case
- For
- Goto
- If
- repeat
- while
- Function Definition
- Procedure Call
- Procedure Definition
有這些基本的功能,可以很容易地在IDL中寫程式控制計算流程。
2.4. 檔案資料的輸出與輸入
由測試檔案資料的輸出與輸入,可以明瞭一套軟體對外聯結最基本的功
能。
2.4.1. 格式化與非格式化
格式化與非格式化的檔案輸出與輸入,應該是大部分語言最基本的功能
。沒有例外IDL亦提供了格式化與非格式化兩種檔案資料的輸出與輸入
,其中格式化的格式與FORTRAN語言相當類似。
2.4.2. 科學計算檔案
與Matlab不同的,IDL另外提供了所謂的科學計算檔案,包括三種格式:
- Common Data Format
- Network Common Data Format
- Hierarchical Data Format
可是並非所有平台的IDL版本均支援上述三種格式,詳細請參照[3]。
2.4.3. 標準影像檔案
IDL的Users' Library提供了一些標準影像檔案的輸出與輸入,例如GIF、
JPEG、TIFF、BMP、PICT、SRF、WAVE等格式。另外XWD、X11
Bitmap、Interfile三種格式只提供輸入的功能。因此IDL在影像檔案處
理上提供比Matlab更多的選則性。
2.5. 程式與函數
IDL程式與函數的宣告方式分別為:
PRO procedure_name, argument1,argument2 ,...
...
RETURN
END
FUNCTION function_name, argument1, argument2,...
...
RETURN
END
宣告方式沒有特別地不一樣,但是要注意的一點是如果在一個檔案中宣
告定義了副程式、函數與主程式,則主程式的宣告區塊要置於最後,這
是因為在IDL中變數是不用先行宣告,如果主程式中用到副程式或函數
,而副程式或函數沒有先行宣告定義,IDL會以為那是變數的。例如對
A = XYZ(6) 而言,IDL是很難分辨 XYZ 是函數或是陣列。
2.5.1. 引數傳遞與呼叫方式
IDL副程式或函數的引數傳遞的方式,是因資料類別不同而分成傳遞
數值以及傳遞位址:
- 表示式、定數、系統變數、陣列等是傳遞數值的方式。
- 變數是傳遞位址的方式。
分辨引數傳遞的方式是很重要的,因為引數以傳遞數值的方式傳入副
程式或函數中,如果對其做任何的更動,是無法傳回原呼叫程式的,
只有以傳遞位址的方式才可以。
另外IDL可以用遞迴的方式呼叫副程式或函數。
2.5.2. 錯誤處理
錯誤的處理在程式環境中是非常重要的,因為他可以提供除錯的資料。
IDL提供三種錯誤處理的功能:
- ON_ERROR
- ON_IOERROR
- CATCH
其中的CATCH與C語言中的setjmp/longjmp功能較為接近。這三種錯誤
處理的次序如下圖:
2.6. Scope
IDL的變數scope亦分成global及local兩種。若變數無特別的宣告時,變
數是屬於local的,若變數以common block宣告時,則才是global變數。
但是系統變數是屬於global,無需特別的宣告。
另外IDL對於程式或函數的尋找先後次序是,先找的是IDL build-in routines,再來是IDL Users' library,最後才是記憶體中的程式或函數。
[Section 1]|[Table Of Contents]|[Section 3]