和一般程式語言一樣, AutoIt 也可自定義函式。自定義函式寫法如下

Func  函式名稱(引數)
      函式本體內容
      (return something)
EndFunc

其中 return 則視函式是否有傳回值而定。

1. 引數內容不需改變

假設寫一函式,引數為 $x,傳回 1+2+3+...+$x,則該函式可這麼寫

; function
Func SumFunc($n)
     $sum=0
     For $i=1 To $n
          $sum = $sum+$i
     Next
     return $sum
EndFunc

到時要調用時,可這麼使用

$x = 5
$sum1 = SumFunc($x) ; $sum1 = 1+2+3+4+5
$sum2 = SumFunc(10) ; $sum2 = 1+2+3+...+10

2. 不改變引數內容 - 給引數預設值

在說這個之前,我們再詳細看一次 MsgBox 的原型是長怎樣

MsgBox ( 旗標, "標題", "文字" [, 逾時 [, 主控制碼(hwnd)] )

上面橘色部份就是選填部份。所謂的選填部份就是可以寫也可以不寫,如果不寫的話就照著預設值跑。如果我們要設定 1 秒後就把這個 MsgBox 關閉的話,可以這麼做

MsgBox(0, "Title", "Text", 1);

這裡我只多了一個引數 -> 1,代表的是逾時時間,但有時我們只想設第五個引數而不想要設第四個引數,第四個引數那對我們而已可能沒意義,於是我們可以用 Default 帶過第四個引數。

MsgBox(0, "title", "Text", Default, 1000)

這樣就可以跳過第四個引數,直接設第5個引數。接著如果自己寫的函式要有預設值功能的話,就直接在函式的引數裡面加上去。直接看例子比較快

Func MyFunc($a=1, $b=10)
        return $a+$b
EndFunc

$x1 = MyFunc() ; 直接使用二個預設引數 1, 10, 故 $x1 = 1+10 = 11
$x2 = MyFunc(5) ; 第一個引數用 5,第二個引數用預設引數 10,故 $x2 = 5 + 10 = 15
$x3 = MyFunc(Default, 5) ; 第一個引數用預設引數 1,第二個引數用 5,故 $x3 = 1 + 5 = 6

函式裡面加入適當的預設引數,可以減少不少設計時的繁雜。

3. 改變引數內容

假設我們寫了一函式要交換二數值,於是我們寫下了這麼一段Swap1函式

Dim $x=10, $y=5
Swap1($x, $y)
MsgBox(0, "交換後", $x & " " &$y)

; SWAP1
Func Swap1($a, $b)
     $t = $a
     $a = $b
     $b = $t
EndFunc

最後結果會發現, $x 和 $y 的內容並未改變。若要在函式中改變其內容,必須在引數裡使用 ByRef 方式宣告,改寫後之 Swap2 如下

Dim $x=10, $y=5
Swap2($x, $y)
MsgBox(0, "交換後", $x & " " &$y)

; SWAP2
Func Swap2(ByRef $a, ByRef $b)
     $t = $a
     $a = $b
     $b = $t
EndFunc

最後 $x 與 $y 值便會交換。

4. Recursive 遞回函式

遞回函式在其它程式語言裡面很常被用到,如果讀者先前沒有程式語言的經驗,這裡只要想做是 "遞回函式" 是 "函式自己會再呼叫自己", "等到一定條件之後,函式會再次結束"。遞回函式這技巧在程式語言很重要,許多很複雜的問題 (如河內塔問題) 可經由遞回函式解決。在此只介紹簡單的遞回應用(雖這個例子用不到遞回,但有心的話請多加練習這個技巧):現在假設要寫 1+2+...+N 的遞回,遞回的概念將會是這麼運作:

(1) Sum(N) = N + Sum(N-1)
(2) Sum(N) = N + (N-1 + Sum(N-2) )
(3) Sum(N) = N + N-1  + ( N-2 + Sum(N-3) )....
....
(N-1) Sum(N) = N + N-1 + ... + N-2 + .... + 3 + Sum(2)
(N)    Sum(N) = N + N-1 + ... + N-2 + .... + 3 + 2 + Sum(1)

好了,最後的 Sum(1) 時,我們就丟回去給它 1。函式寫法如下:

$Sum = RecursiveSum(10)
MsgBox(0, "總合", "$sum=" & $Sum)

Func RecursiveSum($X)
        If $X=1 Then
                Return 1
        Else
                Return $X + RecursiveSum($X-1)
        EndIf
EndFunc

 

edisonx 發表在 痞客邦 PIXNET 留言(0) 人氣()