IDL Testing Plan Section 2

從語言的角度


2. 從語言的角度

由於IDL提供語言的功能,所以測試可以由程式語言的角度來看其功能
特性。而由一般程式語言的角度來看IDL又可以分成:
IDL的語言形式與FORTRAN語言較為相近,是一種高階形式的程式語
言。可是他也提供一般語言該有的資料類別、運算子與指令、檔案資料
的輸出與輸入、副程式與函數等等。

2.1. 資料類別

IDL的資料類別有八種:
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的指令集亦包含了一般語言最基本的形態:
有這些基本的功能,可以很容易地在IDL中寫程式控制計算流程。

2.4. 檔案資料的輸出與輸入

由測試檔案資料的輸出與輸入,可以明瞭一套軟體對外聯結最基本的功
能。

2.4.1. 格式化與非格式化

格式化與非格式化的檔案輸出與輸入,應該是大部分語言最基本的功能
。沒有例外IDL亦提供了格式化與非格式化兩種檔案資料的輸出與輸入
,其中格式化的格式與FORTRAN語言相當類似。

2.4.2. 科學計算檔案

與Matlab不同的,IDL另外提供了所謂的科學計算檔案,包括三種格式:
可是並非所有平台的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提供三種錯誤處理的功能:
其中的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]