認識Arduino與C語言的函式指標以及函式指標陣列

讀者詢問如何在Arduino中建立數個自訂函式,並且透過「函式指標陣列」,在不使用if…else或switch…case等條件判斷式的情況下,讓程式依據變數的值,執行不同的自訂函式。

下文將先介紹Arduino與C程式語言的函式指標語法。

建立函式指標程式

就像變數一樣,函式(function)同樣被暫存在某個記憶體區塊,可以透過指標(pointer)取用;指向函式的指標稱為「函式指標(function pointer)」

底下的Arduino程式宣告了一個hello()自訂函式,並透過一個叫做‘f’的指標指向並執行它:

函式指標程式示範

若在Arduino執行此程式,將能在序列埠監控視窗看見“hello world.”訊息。

函式指標的語法

函式指標的語法如下:

函式指標的語法

指標名稱必須用代表「優先處理」的小括號包圍,如果少了小括號,程式敘述的意義將大不相同:

指標名稱必須用代表「優先處理」的小括號包圍

上面的Arduino程式碼,若用C語言改寫,將變成:

函式指標的參數傳遞與傳回值

假如要透過指標參照具有輸入參數和傳回值的函式,例如,一個計算並傳回兩整數相加值的自訂函式“sum”:

計算並傳回兩整數相加值的自訂函式“sum”

函式指標的定義也要跟著修改:

具備參數傳遞與傳回值的函式指標

完整的Arduino範例程式如下:

相同功能的C語言程式的範例如下:

函式指標陣列

認識函式指標的語法之後,函式指標陣列的語法也很容易理解。假設程式事先宣告了名叫fn0, fn1和fn3的函式,底下的敘述將透過自訂的 "f" 指標陣列指向它們:

底下是Arduino版本的函式指標陣列範例,上傳程式碼之後,開啟序列埠監控視窗,接著在序列埠監控視窗中輸入0~2的數字,程式將執行對應的fn0~fn2函式。

底下是C程式語言的版本:

延伸閱讀

6 thoughts on “認識Arduino與C語言的函式指標以及函式指標陣列

  1. 昨天研究了一下老師的方法, 解決了我的問題, 且我發現更棒的是函式命名不必有數字上順序的關係, 只要函式指標陣列跟函式有對應到, 順序就照陣列使用方式取用, 這樣說是對的吧?
    void fn0() {
    }

    void power_on() {
    }

    void check_status() {

    }

    void (*f[3]) () = {fn0, power_on, check_status};

  2. 感謝老師^_^
    我昨天發現原來我第一本老師的書是Flash 5 撼動網頁寶典, 而非Flash MX 網頁動畫寶典, ^_^

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *