網頁標題: AutoIt!! 二維陣列
 



Dec 22 Wed 2010 12:51 
[A] AutoIt!! 二維陣列
分享:   

1. 名稱定義

Dim $Arr[維度1][維度2][維度3]...[維度N]

在說明多維陣列時,先以上為例定義出二個名詞出來。

(1) 維度:以上為例,$Arr 陣列維度即為 N 維。故一維陣列為 Dim $Arr[維度1];二維陣列為 Dim $Arr[維度1][維度2];依此類推。

(2) 元素:這是陣列裡面可以實際存取的單位,以一維陣列 Dim $Arr[2] = [1,2] 為例,實際上可以存取的元素是 $Arr[0] 與 $Arr[1];而二維陣列 $Arr[2][3] = [ [1,2,3],[4,5,6]]

2. 多維陣列之宣告

在某些情況下,我們使用到的陣列可能不是一維而是二維甚至是三維陣列。比如說,要存的是一張 bmp 圖檔的資訊。一張 bmp 圖檔假設高度為 $H,寬度為 $W,則共有 $H * $W 個點。然而每個點還有 R、G、B 三個向量所組成,所以宣告時可能會變成這樣:

Dim $W=800, $H=600
Dim $R[$W][$H],$G[$W][$H],$B[$W][$H]

也或者是直接宣告成一個三維陣列

Dim $W=800, $H=600
Dim $RGB[$W][$H][3]

這樣調用時,可以假設 $RGB[100][100][0] 為位於點 (100,100) 之 R 資訊;$RGB[100][100][1] 為位於點 (100,100) 之g 資訊;$RGB[100][100][2] 為位於點 (100,100) 之B 資訊。

至於初值設定的話可以這麼設

Dim $X[2][3] = [ [1,2,3],[4,5,6] ]
Dim $Y[2][3][4] = [ [     [1,2,3,4],    [5,6,7,8],   [9,10,11,12] ] , _
                  [ [13,14,15,16], [17,18,19,20], [21,22,23,24] ]  ]

3. 使用多維陣列

假設二陣列已這麼宣告

Dim $Arr[3][2]

宣告時我沒給它初值,日後要設值給它的時候可以這麼做

$Arr[0][0] = "文字00"
$Arr[0][1] = "文字01"
$Arr[1][0] = "文字10"
$Arr[1][1] = "文字11"
$Arr[2][0] = "文字20"
$Arr[2][1] = "文字21"

而若通常陣列大時,也是用迴圈方式去跑,二維陣列以上通常都會配合讀檔方式把數值讀進來,讀檔日後再說明。現在示範用 loop 依序遞增二維陣列之值

Dim $x = 5, $y=6
Dim $Arr[$x][$y]
Dim $msg

; 設定陣列內容
For $i=0 To $x-1
    For $j=0 To $y-1
        $Arr[$i][$j] = $i*$y+$j
        $msg &= $Arr[$i][$j] & @TAB
    Next
    $msg &= @CRLF
Next

; 顯示陣列內容
MsgBox(4096, "內容", $msg)

上篇文章有提到,在一維陣列時,可以用 UBound 去得知陣列的大小,相同的,這也可以用來多維陣列上。假設要知道第一個維度大小時,UBound 就給它 1 (UBound($Arr, 1)) ;要知道第二個維度大小時就調用 UBound($Arr, 2)。例如:

Dim $Arr[10][20]

$dim1 = UBound($Arr, 1)
$dim2 = UBound($Arr, 2)

MsgBox(4096,"title", $dim1) ; 10
MsgBox(4096,"title", $dim2) ; 20

4. 重新設定大小

二維陣列或多維陣列要重新設定大小和一維方式一樣,但麻煩的事有些洗掉之後就不易得知哪些會保留、哪些不會保留。故若使用多維陣列,重新設定大小時,建議其元素值均需重新給過。

Dim $Arr[2][10]
ReDim $Arr[4][5]

需注意的是,一開始 $Arr 就宣告成二維陣列,於是 ReDim 也一定要是二維陣列,不可是其它維度之陣列。

5. 應用例子

事實上許多線性代數的問題都要用到二維陣列,以下例子即為二維陣列之加法運算,至於減法與除法若有興趣可自行研究。

Dim $A[2][3] = [ [1,2,3],[4,5,6] ]
Dim $B[2][3] = [ [7,8,9],[10,10,10] ]
Dim $C[2][3] ; $C = $A + $B

Dim $msg
For $i=0 To UBound($A, 1)-1
    For $j=0 To UBound($A, 2)-1
        $C[$i][$j] = $A[$i][$j] + $B[$i][$j]
        $msg &= $C[$i][$j] & @TAB
    Next
    $msg &= @CRLF
Next
MsgBox(4096, "二維陣列內容",$msg)

edisonx 發表在 痞客邦 PIXNET 迴響(0) 引用(0) 人氣(250)

http://edisonx.pixnet.net/blog/post/38641037
回 · 發現好東西 autoit 這一篇文章封面


本文張貼者:校校鴿〔張貼時間:民國100年10月10日(星期一)19點47分〕 | 寫信給校校鴿

部落格首頁


學習的故鄉首頁
本站公告:〔您越需要我們,我們就越有創意〕 本站說明書:〔發現故鄉還有改進的地方,請來信告訴原丁們〕
觀察應用學習點數 :〔咱的故鄉有您的參與,會使我們有更大的發揮空間,展現更豐富精彩的學習畫面〕 〔期待藉由無障礙網頁設計,能讓視障小朋友更愛看書、更愛寫作且更愛學習〕:盲用電腦「心得分享」
〔為了讓我們有乾淨的學習環境,請勿任意在本站散播商業廣告與不合法文件或聯結〕:本站宣示