微剋多資訊

 找回密碼
 註冊

Login

Login

搜索
回覆 6則 瀏覽 4882篇

[教學] AutoIt 幼幼班第一課 - Array 陣列

該用戶從未簽到

發表於 2012-10-21 15:00 | 顯示全部樓層 |閱讀模式
本帖最後由 rictirse 於 2014-12-24 08:30 編輯

介紹的部分擷取官方介紹

所謂 群組 (Array) 就是內含一序列類型及大小相同的類別 (element) 資料這類變數。這個變數內的每個類別,都可以依索引編號存取。

範例:

讓我們來說明一下,假設您要儲存這一堆符號:"A", "U", "T", "O", "I", "T" 和 "3";
雖然您是可以用七種不同的變數來做,不過用一個群組會更有效率:

$Array[0]="A"
$Array[1]="U"
..等等..
$Array[6]="3"

要存取一個群組內的指定數值的話,您只要知道索引標號就可以了:

$MyChar=$Array[2]

這裡 $MyChar 的結果為內含字母 "T" (也可以看做 '運算子')。


索引編號也可以替換成其它的變數或一個運算式,所以您可以建立一套複雜的方式來指定、或存取一個群組內的類別。


群組也可以是多重範圍類型 (dimensional),假設您使用到好幾個一序列的索引編號,像:

$Array[0][0]="左上(Upper-Left)"
$Array[1][0]="左下(Lower-Left)"
$Array[0][1]="右上(Upper-Right)"
$Array[1][1]="右下(Lower-Right)"

(這些值只是範例)

在一個群組內,您最多可使用到 64 組範圍,項目總數不能大於 2^24 (16 777 216)。

在您開始使用腳本內的群組之前,必須先使用 'Dim' 關鍵字為它們定義好界限。

群組內的資料類型 (Data types in Arrays)

本來它是說:一個群組內只能內含「一種」資料類型。不過技術文獻提到,在 AutoIt 內,變數可以把來自數字的任何東西都包括在布林變數中。所以這就是說,一個 AutoIt-Array 群組還是可以有不同類型的,甚至是其它群組都可以:

$Array[0]=1
$Array[1]=true
$Array[2]="文字"
$Array[3]=$AnotherArray

這個在 AutoIt 中是不會嚴格禁止的。不過,將不同的資料類型都混合在一個群組中,是很不妥當的。尤其是在一個群組內使用另一個群組,更會讓您的腳本執行速度嚴重受影響。
看完上面官方的教學,大概對Array 有基本的認識了
如果還是看不懂官方的介紹沒關係,噹噹帶你由淺入深的學習
馬上看範例
  1. Dim $Array[6];; 宣告一個 Array高度為6的陣列
複製代碼
如果需要給陣列初始值可以這樣宣告
  1. Dim $Array[6] = [0,1,2,3,4,5]
複製代碼
或是這樣宣告意思是一樣的
  1. Dim $Array[6]

  2. $Array[0] = 0
  3. $Array[1] = 1
  4. $Array[2] = 2
  5. $Array[3] = 3
  6. $Array[4] = 4
  7. $Array[5] = 5
複製代碼
當然一個一個宣告是很沒效率的事情
如果這一個陣列高度有100,那豈不是要填入初始值就要寫一百次嗎?
所以就需要藉由迴圈(Loop)來達到目的
  1. Dim $Array[6]

  2. For $i = 0 To 5
  3.         $Array[$i] = $i
  4. Next
複製代碼
會宣告Array後,如果不知道你自己宣告的初始值是不是正確這時候就需要動用到 官方的Array檢視功能
  1. #include <Array.au3>;; 呼叫 Array.au3

  2. Dim $Array[6];定義array高度為6

  3. For $i = 0 To 5;; 設定迴圈 i = 0 到 5 之間的數字有 0、1、2、3、4、5 一共六個
  4.         $Array[$i] = $i;將數值填入陣列中
  5. Next

  6. _ArrayDisplay($Array);顯示 Array 內的數值
複製代碼
接著介紹一個可以查詢陣列高度的指令
  1. Dim $Array[6];定義array高度為6

  2. MsgBox ( 0, "陣列高度為", UBound ($Array));show出陣列高度
複製代碼
如果可以查出陣列高度這樣當然也可以用在forloop上
  1. #include <Array.au3>

  2. Dim $Array[6]

  3. For $i = 0 To (UBound ($Array)-1); 前一個例子看UBound (Array) = 6 但是這邊的for loop是 從0 開始所以看UBound (Array)-1 = 5 不然會超過loop範圍
  4.         $Array[$i] = $i
  5. Next

  6. _ArrayDisplay($Array)
複製代碼
介紹完 一維Array 接著介紹二維以上的陣列
初始值宣告一樣
  1. Dim $Array[3][3];宣告一個3*3的陣列
複製代碼
如果要加入初始值的話宣告就是這樣
  1. #include <Array.au3>

  2. Dim $Array[3][3] = [ [0,0,0], [1,1,1], [2,2,3] ]

  3. _ArrayDisplay ($Array)
複製代碼
或是這樣
  1. #include <Array.au3>

  2. Dim $Array[3][3]

  3. $Array[0][0] = 0
  4. $Array[0][1] = 0
  5. $Array[0][2] = 0

  6. $Array[1][0] = 1
  7. $Array[1][1] = 1
  8. $Array[1][2] = 1

  9. $Array[2][0] = 2
  10. $Array[2][1] = 2
  11. $Array[2][2] = 2

  12. _ArrayDisplay ($Array)
複製代碼
這樣子宣告很複雜的陣列螢幕寬度會不夠,或是很難維護
所以也可以這樣換行,方便閱覽
  1. #include <Array.au3>

  2. ;;; 在「,」 後面一個空白 加入 _ 就可以換行
  3. Dim $Array[3][3] = [ [0,0,0], _
  4.                 [1,1,1], _
  5.                 [2,2,3] ]

  6. _ArrayDisplay ($Array)
複製代碼
接下來教如何用迴圈填入初始值
因為是二維陣列,所以這時候就需要雙迴圈才能達到目的
  1. #include <Array.au3>

  2. Dim $Array[3][3]

  3. For $i = 0 To 2; i 迴圈
  4.         For $j = 0 To 2; j 迴圈
  5.                 $Array[$i][$j] = $i^$j ; 將資料分別填入 迴圈內
  6.         Next
  7. Next

  8. _ArrayDisplay ($Array)
複製代碼
當然查詢Array高度也是非常重要的指令
  1. Dim $Array[5][3];;宣告一個 高度5、寬度3的 二維陣列

  2. ;;; @CRLF 是換行符號 在 &@CRLF& 後面空白 加入 _ 就可以換行
  3. MsgBox (0, "陣列大小", "維度 = "&UBound ($Array, 0)&@CRLF& _ ; UBound ($Array, 0) 0是查詢維度
  4.                                 "高度 = "&UBound ($Array, 1)&@CRLF& _ ;; 1是查詢高度
  5.                                 "寬度 = "&UBound ($Array, 2)) ;; 2是查詢寬度
複製代碼
應用在 For loop上的話就是這樣
  1. #include <Array.au3>

  2. Dim $Array[5][3];;宣告一個 高度5、寬度3的 二維陣列

  3. For $i = 0 To (UBound ( $Array, 1)-1);;i 迴圈
  4.         For $j = 0 To (UBound ( $Array, 2)-1);; j 迴圈
  5.                 $Array[$i][$j] = "i = "&$i&", j = "&$j
  6.         Next
  7. Next

  8. _ArrayDisplay ($Array)
複製代碼
ReDim 功能是一個可以重新定義Array 大小的函式
  1. #include <array.au3>

  2. Dim $Array[1];; 宣告一個 一維陣列 高度為 1

  3. _ArrayDisplay($Array)

  4. ReDim $Array[5];; 重新定義陣列高度 為5

  5. _ArrayDisplay($Array)
複製代碼
二維陣列宣告方式也是一樣
  1. #include <array.au3>

  2. Dim $Array[3][3] = [ [0,0,0], [1,1,1], [2,2,3] ]

  3. _ArrayDisplay($Array)

  4. ReDim $Array[5][5];; 重新定義陣列高度 為5

  5. _ArrayDisplay($Array)
複製代碼
就算重新定義陣列大小,陣列內的資料並不會消失非常方便使用

接著介紹 Array 擴展函式
_ArrayPush(ByRef$avArray, $vValue[, $iDirection = 0])
新增值但不增加陣列大小,在結尾插入新值則刪除第一個,反之亦然。
  1. 1.  #include <Array.au3>
  2. 2.  
  3. 3.  Dim $avArrayTarget[9] = [1, 2, 3, 4, 5, 6, 7, 8, 9]
  4. 4.  Dim $avArraySource[2] = [100, 200]
  5. 5.  
  6. 6.  _ArrayDisplay($avArrayTarget, "顯示 avArrayTarget 陣列內容");; 顯示 avArrayTarget 陣列內容
  7. 7.  
  8. 8.  _ArrayPush($avArrayTarget, $avArraySource);; 插入陣列內容 從右邊 (下方)新增 (預設值)
  9. 9.  _ArrayDisplay($avArrayTarget, "插入陣列內容 從右邊新增 (預設值)")
  10. 10.  
  11. 11.  _ArrayPush($avArrayTarget, $avArraySource, 1);; 插入陣列內容 從左邊(上方)新增
  12. 12.  _ArrayDisplay($avArrayTarget, "插入陣列內容 從左邊新增")
  13. 13.  
  14. 14.  _ArrayPush($avArrayTarget, "Hello world!", 1);: 從左邊(上方)新增 一個數值後並加入一組陣列
  15. 15.  _ArrayDisplay($avArrayTarget, "從左邊(上方)新增 一個數值後並加入一組陣列")
複製代碼
_ArrayAdd(ByRef $avArray,$vValue)
在陣列的最後方新增一組數據
  1. 1.  #include <Array.au3>
  2. 2.  
  3. 3.  Dim $Array[6] = [0,1,2,3,4,5]
  4. 4.  
  5. 5.  _ArrayDisplay($Array);顯示Array初始值
  6. 6.  
  7. 7.  _ArrayAdd( $Array, 6)
  8. 8.  
  9. 9.  _ArrayDisplay($Array, "顯示新增後的Array")
複製代碼
_ArrayDelete(ByRef$avArray, $iElement)
刪除某一個陣列資料,Array大小-1
  1. 1.  #include <Array.au3>
  2. 2.  [code]#include <Array.au3>
  3. 3.  
  4. 4.  Dim $Array[6] = [0,1,2,3,4,5]
  5. 5.  
  6. 6.  _ArrayDisplay ($Array);顯示Array初始值
  7. 7.  
  8. 8.  _ArrayDelete ( $Array, 5); 刪除編號 第五號的 陣列內容與array高度-1
  9. 9.  
  10. 10.  _ArrayDisplay ($Array);顯示刪除後的Array
複製代碼

簽到天數: 167

該用戶今日未簽到

發表於 2013-2-15 16:35 | 顯示全部樓層
本帖最後由 gary8349 於 2013-2-15 17:08 編輯

~~~補上遺失的樓層~~~

看完上面官方的教學,大概對Array 有基本的認識了
如果還是看不懂官方的介紹沒關係,噹噹帶你由淺入深的學習
馬上看範例
[code=autoit]   Dim $Array[6];; 宣告一個 Array高度為6的陣列[/code]
如果需要給陣列初始值可以這樣宣告
[code=autoit]  Dim $Array[6] = [0,1,2,3,4,5][/code]
或是這樣宣告意思是一樣的
[code=autoit]     Dim $Array[6]

   $Array[0] = 0
      $Array[1] = 1
   $Array[2] = 2
   $Array[3] = 3
   $Array[4] = 4
   $Array[5] = 5[/code]
當然一個一個宣告是很沒效率的事情
如果這一個陣列高度有100,那豈不是要填入初始值就要寫一百次嗎?
所以就需要藉由迴圈(Loop)來達到目的
[code=autoit]Dim $Array[6]

   For $i = 0 To 5
           $Array[$i] = $i
   Next[/code]
會宣告Array後,如果不知道你自己宣告的初始值是不是正確 這時候就需要動用到 官方的Array檢視功能
[code=autoit]#include <Array.au3>;; 呼叫 Array.au3
   
   Dim $Array[6];定義array高度為6
   
   For $i = 0 To 5;; 設定迴圈 i = 0 到 5 之間的數字有 0、1、2、3、4、5 一共六個
           $Array[$i] = $i;將數值填入陣列中
.   Next
   
   _ArrayDisplay($Array);顯示 Array 內的數值[/code]
接著介紹一個可以查詢陣列高度的指令
[code=autoit]Dim $Array[6];定義array高度為6
   
   MsgBox ( 0, "陣列高度為", UBound ($Array));show出陣列高度[/code]
如果可以查出陣列高度這樣當然也可以用在for loop上
[code=autoit]#include <Array.au3>
   
   Dim $Array[6]
   
   For $i = 0 To (UBound ($Array)-1); 前一個例子看UBound (Array) = 6 但是這邊的for loop是 從0 開始所以看UBound (Array)-1 = 5 不然會超過loop範圍
           $Array[$i] = $i
   Next

   _ArrayDisplay($Array)[/code]

回覆

使用道具 舉報

簽到天數: 167

該用戶今日未簽到

發表於 2013-2-15 16:40 | 顯示全部樓層
本帖最後由 gary8349 於 2013-2-15 17:08 編輯

~~~補上遺失的樓層~~~

介紹完 一維Array 接著介紹二維以上的陣列
初始值宣告一樣
[code=autoit]Dim $Array[3][3];宣告一個3*3的陣列[/code]
如果要加入初始值的話宣告就是這樣
[code=autoit]#include <Array.au3>
   
   Dim $Array[3][3] = [ [0,0,0], [1,1,1], [2,2,3] ]
   
   _ArrayDisplay ($Array)[/code]
或是這樣
[code=autoit]#include <Array.au3>
   
   Dim $Array[3][3]
   
   $Array[0][0] = 0
.   $Array[0][1] = 0
   $Array[0][2] = 0
   
   $Array[1][0] = 1
   $Array[1][1] = 1
   $Array[1][2] = 1
   
   $Array[2][0] = 2
   $Array[2][1] = 2
   $Array[2][2] = 2
   
   _ArrayDisplay ($Array)[/code]
這樣子宣告很複雜的陣列螢幕寬度會不夠,或是很難維護
所以也可以這樣換行,方便閱覽
[code=autoit]#include <Array.au3>
  1. #include <Array.au3>
  2.    
  3.    ;;; 在「,」 後面一個空白 加入 _ 就可以換行
  4.    Dim $Array[3][3] = [ [0,0,0], _
  5.                    [1,1,1], _
  6.                    [2,2,3] ]
  7.    
  8.    _ArrayDisplay ($Array)
複製代碼
接下來教如何用迴圈填入初始值
因為是二維陣列,所以這時候就需要雙迴圈才能達到目的
[code=autoit]#include <Array.au3>
   
   Dim $Array[3][3]

   For $i = 0 To 2; i 迴圈
           For $j = 0 To 2; j 迴圈
                   $Array[$i][$j] = $i^$j ; 將資料分別填入 迴圈內
.           Next
   Next
   
   _ArrayDisplay ($Array)[/code]
當然查詢Array高度也是非常重要的指令
[code=autoit]Dim $Array[5][3];;宣告一個 高度5、寬度3的 二維陣列
   
   ;;; @CRLF 是換行符號 在 &@CRLF& 後面空白 加入 _ 就可以換行
   MsgBox (0, "陣列大小", "維度 = "&UBound ($Array, 0)&@CRLF& _ ; UBound ($Array, 0) 0是查詢維度
                                   "高度 = "&UBound ($Array, 1)&@CRLF& _ ;; 1是查詢高度
                                   "寬度 = "&UBound ($Array, 2)) ;; 2是查詢寬度[/code]
應用在 For loop上的話就是這樣
[code=autoit]#include <Array.au3>
   
   Dim $Array[5][3];;宣告一個 高度5、寬度3的 二維陣列
   
   For $i = 0 To (UBound ( $Array, 1)-1);;i 迴圈
           For $j = 0 To (UBound ( $Array, 2)-1);; j 迴圈
                   $Array[$i][$j] = "i = "&$i&", j = "&$j
           Next
   Next
   
   _ArrayDisplay ($Array)[/code]
ReDim 功能是一個可以重新定義Array 大小的函式
[code=autoit]   #include <array.au3>
   
   Dim $Array[1];; 宣告一個 一維陣列 高度為 1
   
   _ArrayDisplay($Array)
   
   ReDim $Array[5];; 重新定義陣列高度 為5
   
   _ArrayDisplay($Array)[/code]
二維陣列宣告方式也是一樣
[code=autoit]#include <array.au3>

   Dim $Array[3][3] = [ [0,0,0], [1,1,1], [2,2,3] ]
   
   _ArrayDisplay($Array)
   
   ReDim $Array[5][5];; 重新定義陣列高度 為5
   
   _ArrayDisplay($Array)[/code]
就算重新定義陣列大小,陣列內的資料並不會消失非常方便使用
接著介紹 Array 擴展函式
_ArrayPush(ByRef$avArray, $vValue[, $iDirection = 0])
新增值但不增加陣列大小,在結尾插入新值則刪除第一個,反之亦然。
[code=autoit]#include <Array.au3>

   Dim $avArrayTarget[9] = [1, 2, 3, 4, 5, 6, 7, 8, 9]
   Dim $avArraySource[2] = [100, 200]
   
   _ArrayDisplay($avArrayTarget, "顯示 avArrayTarget 陣列內容");; 顯示 avArrayTarget 陣列內容
   
   _ArrayPush($avArrayTarget, $avArraySource);; 插入陣列內容 從右邊 (下方)新增 (預設值)
   _ArrayDisplay($avArrayTarget, "插入陣列內容 從右邊新增 (預設值)")
   
   _ArrayPush($avArrayTarget, $avArraySource, 1);; 插入陣列內容 從左邊(上方)新增
   _ArrayDisplay($avArrayTarget, "插入陣列內容 從左邊新增")
   
   _ArrayPush($avArrayTarget, "Hello world!", 1);: 從左邊(上方)新增 一個數值後並加入一組陣列
   _ArrayDisplay($avArrayTarget, "從左邊(上方)新增 一個數值後並加入一組陣列")[/code]
_ArrayAdd(ByRef$avArray, $vValue)
在陣列的最後方新增一組數據
[code=autoit]#include <Array.au3>
   
   Dim $Array[6] = [0,1,2,3,4,5]

   _ArrayDisplay($Array);顯示Array初始值
   
   _ArrayAdd( $Array, 6)

   _ArrayDisplay($Array, "顯示新增後的Array")[/code]
_ArrayDelete(ByRef$avArray, $iElement)
刪除某一個陣列資料,Array大小-1
[code=autoit]
#include <Array.au3>
  1. #include <Array.au3>
  2.    
  3.    Dim $Array[6] = [0,1,2,3,4,5]
  4.    
  5.    _ArrayDisplay ($Array);顯示Array初始值
  6.    
  7.    _ArrayDelete ( $Array, 5); 刪除編號 第五號的 陣列內容與array高度-1
  8.    
  9.    _ArrayDisplay ($Array);顯示刪除後的Array
複製代碼
<< 學習筆記 >>
指令:_ArrayDisplay
目的:在訊息框中顯示某個陣列(數組) 1維 或 2維 所有元素內容
語法:
#include <Array.au3>                                      
            _ArrayDisplay(Const ByRef $avArray
                      [ , $sTitle = ""Array: ListViewDisplay""
                      [ , $iItemLimit = -1
                      [ , $iTranspose = 0
                      [ , $sSeparator = """"
                      [ , $sReplace = ""|""
                      [ , $sHeader = """"]]]]]])
參數:                                    
           $avArray:       要顯示的陣列                     
           $sTitle:           [可選] 視窗上的標題                       
           $iItemLimit:  [可選] 訊息框可顯示最多行數(Rows)
                                     預設值:-1 (全部顯示不限行數)
           $iTranspose: [可選] 預設0,其他值,則陣列的行、列值互換                       
           $sSeparator: [可選] 快速設定 Opt("GUIDataSeparatorChar") 值                     
           $sReplace :   [可選] 取代  陣列元素中 $sSeparator 字符                        
           $sheader:      [可選] 訊息框的標頭 (用 "|" 分開)                     

傳回值:
          成功(Success)傳回值:1                     
          失敗(Failure):0
              設定錯誤值: (@error)
              1 - $avArray 非 陣列                       
              2 - 超出 $avArray 陣列 維數(僅支援至 2維)        

範例.1
[code=autoit]#include <Array.au3>
   Dim $Array[3][3] = [ [0,0,0], [1,1,1], [2,2,2] ]
   _ArrayDisplay ($Array,"標準排列-心得筆記")[/code]

範例.2
[code=autoit]#include <Array.au3>
   Dim $Array[3][3] = [ [0,0,0], [1,1,1], [2,2,2] ]
   _ArrayDisplay ($Array,"行列互換-心得筆記",-1,1)[/code]
                                 
範例.3
[code=autoit]   #include <Array.au3>
   Dim $Array[3][3] = [ [0,0,0], [1,1,1], [2,2,2] ]
    _ArrayDisplay ($Array,"欄位名稱-心得筆記",-1,0,"","","行|柱0|柱1|柱2")[/code]

備註:功力不足,無法秀出$sSeparator 及 $sReplace 範例!

噹噹編輯於2012/10/22
[code=autoit]
1.  #include <array.au3>
2.  
3.  Global $aTestArray[2][2] = [ [1, 2],[ "Test Row 1 Column 1", "Test Row 1 Column 2"] ];宣告 2X2 陣列
4.  
5.  _ArrayDisplay ( $aTestArray, "Test Array 1");; 預設
6.  
7.  _ArrayDisplay ( $aTestArray, "Test Array 2", -1, 0, "", "", "Row|Column1|Column2");; 自訂 Header 分行符號 「|」
8.  
9.  _ArrayDisplay ( $aTestArray, "Test Array 3", -1, 0, ",", "", "Row,Column1,Column2");; 自訂 Header 分行符號為「,」
10.  [/code]

本帖子中包含更多資源

您需要 登入 才可以下載或查看,沒有帳號?註冊

x
回覆

使用道具 舉報

該用戶從未簽到

 樓主| 發表於 2013-2-16 00:22 | 顯示全部樓層
gary8349 發表於 2013-2-15 16:40
~~~補上遺失的樓層~~~

介紹完 一維Array 接著介紹二維以上的陣列

我發文在 tab 中了耶...
回覆

使用道具 舉報

簽到天數: 167

該用戶今日未簽到

發表於 2013-2-16 21:12 | 顯示全部樓層
rictirse 發表於 2013-2-16 00:22
我發文在 tab 中了耶...

是喔...我不知道啦~~ (別打我 (逃...
tab是什麼東東???
回覆

使用道具 舉報

該用戶從未簽到

 樓主| 發表於 2013-2-16 22:51 | 顯示全部樓層
gary8349 發表於 2013-2-16 21:12
是喔...我不知道啦~~ (別打我 (逃...
tab是什麼東東???

就分頁阿qq
其他的教學在第二、三、四頁哦
http://www.microduo.tw/forum.php?mod=viewthread&tid=20731&tpage=2

回覆

使用道具 舉報

簽到天數: 167

該用戶今日未簽到

發表於 2013-2-16 22:55 | 顯示全部樓層
rictirse 發表於 2013-2-16 22:51
就分頁阿qq
其他的教學在第二、三、四頁哦
http://www.microduo.tw/forum.php?mod=viewthread&tid=20731&t ...

><"
沒看到有... (眼殘
哈哈...那就幫我把它們砍了吧
這個也砍了
http://www.microduo.tw/forum.php ... id=22333&pid=152628

3QQ~
回覆

使用道具 舉報

您需要登入後才可以回帖 登入 | 註冊

本版積分規則

小黑屋|Archiver|微剋多資訊(MicroDuo)

GMT+8, 2016-12-5 20:29

Discuz! X

© 2009-2016 Microduo

快速回覆 返回頂部 返回列表