SDCC 函數指標 (4)

Posted by: 邱小新 at 上午10:56 in

函數指標陣列

  1. 陣列宣告

    typedef int (*pt2Function)(int, int) __reentrant; pt2Function funcArr1[10]; int (*funcArr2[10])(int, int) __reentrant;

    funcArr1 跟 funcArr2 宣告結果是一樣的,利用 typedef 比較容易理解。

  2. 範例程式

    int Plus(int a, int b) __reentrant { return a+b; } int Minus(int a, int b) __reentrant { return a-b; } void main() { int (*funcArr[10])(int, int) __reentrant; printf("\nExecuting 'Array_Of_Function_Pointers'\n"); funcArr[0] = &Plus; funcArr[1] = &Minus; printf("12 + 5 = %d\n", funcArr[0](12, 5)); printf("12 - 5 = %d\n", (*funcArr[1])(12, 5)); }

SDCC 函數指標 (3)

Posted by: 邱小新 at 上午10:03 in

函數指標當成回傳值

  1. 函數宣告

    typedef int(*pt2Func)(int, int) __reentrant; pt2Func GetPtr1(const char opCode); int (*GetPtr2(int, int) __reentrant)(const char opCode);

    GetPtr1 跟 GetPtr2 宣告結果是一樣的,利用 typedef 比較容易理解。其中的 __reentrant 也可以不用宣告,因為只是函數指標傳遞並不影響函數中的區域變數的使用。

  2. 程式範例

    int Plus(int a, int b) __reentrant { return a+b; } int Minus(int a, int b) __reentrant { return a-b; } int (*GetPtr1(int, int))(const char opCode) { if(opCode == '+') return &Plus; else return &Minus; } void main() { int (*pt2Function)(int, int) __reentrant = NULL; printf("Executing 'Return_A_Function_Pointer'\n"); pt2Function=GetPtr1('+'); printf("2+4=%d\n", (*pt2Function)(2, 4)); pt2Function=GetPtr1('-'); printf("2-4=%d\n", (*pt2Function)(2, 4)); }

SDCC 函數指標 (2)

Posted by: 邱小新 at 下午4:02 in

函數指標當成參數傳遞

  1. 參數宣告

    void PassPtr(int (*pt2Func)(int)); void PassPtr(int (*pt2Func)(int, char, char) __reentrant);

  2. 程式範例

    int DoIt(float a, char b, char c) __reentrant { printf("DoIt\n"); return a+b+c; } int DoMore(float a, char b, char c) __reentrant { printf("DoMore\n"); return a-b+c; } void PassPtr(int (*pt2Func)(float, char, char) __reentrant) { int result = (*pt2Func)(12, 'a', 'b'); printf("%d\n", result); } void main() { printf("Executing 'Pass_A_Function_Pointer'\n"); PassPtr(&DoIt); PassPtr(&DoMore); }

SDCC 函數指標 (1)

Posted by: 邱小新 at 下午3:26 in
  1. 函數指標宣告

    int (*pt2Function1)(int) = NULL; int (*pt2Function2)(int, char) __reentrant = NULL;

    當函數指標裏的參數超過一個時,就必須宣告成可再入函數型態(__reentrant),否則會出現 Functions called via pointers must be 'reentrant' to take this many arguments 的錯誤。

  2. 函數指標 typedef

    typedef int (*pt2func)(int, char) __reentrant; pt2func pt2Function1 = NULL; int (*pt2Function2)(int, char) __reentrant = NULL;

    pt2Function1 跟 pt2Function2 二者宣告的結果是一樣,而 pt2Function1 看起來更容易理解,也更像一般的變數。

  3. 函數指標設定給值

    int DoIt (int a) { printf("DoIt\n"); return a; } int DoMore(int a, char b) __reentrant { printf("DoMore\n"); return a-b; } pt2Function1 = DoIt; // 簡單表示法 pt2Function2 = &DoMore; // 正規表示法

    當指標函數宣告成 __reentrant 型態,其相對應的函數也要宣告成 __reentrant,否則會造成二者參數傳遞出問題,這個 bug 編輯器可是不會顯示警告的。

  4. 函數指標比較

    if(pt2Function1 > 0) { // check if initialized if(pt2Function1 == &DoIt) printf("Pointer points to DoIt\n"); } else printf("Pointer not initialized!!\n");

  5. 函數指標執行

    int result1 = pt2Function1 (12); // 簡單表示法 int result2 = (*pt2Function2)(12, 'a'); // 正規表示法