2013年1月10日 星期四

[C]函式指標陣列用法(Array of Function Pointers)

在寫程式時候,我們常常會碰到根據不同狀態去執行不同函式的情況。比如說下列範例,根據state變數的狀態去呼叫對應的函式。

state: 0,執行run()
state: 1,執行stop()
state: 2,執行exit()

void run() {
    printf("start\r\n");
}

void stop() {
    printf("stop\r\n");
}

void exit() {
    printf("exit\r\n");
}
bool OnStateChange(uint state) {
    if (state == 0) {
        run();
    }
    else if (state == 1) {
        stop();
    }
    else if (state == 2) {
        exit();
    }
    else {
        printf("Wrong state!\n");
        return false;
    }       

    return true;
}
用if判斷式是最簡單的方法。不過如果state變多。整段code就會變得很冗長。
int OnStateChange(uint state) {
    switch (state) {
    case 0:
        run();
        break;
    case 1:
        stop();
        break;
    case 2:
        exit();
        break;
    default:
        printf("Wrong state!\n");
        return false;
    }
    return 0;
}
改用switch看起來有比較乾淨一點。不過state變多,程式碼也會變得冗長。有沒有什麼更精簡的作法呢?這時候函式指標陣列就派上用場了。
static void (*command[])(void) = {run, stop, exit};

int OnStateChange(uint state) {
       
    if (state > 3) { 
        printf("Wrong state!\n");
        return false;
    }

    command[state]();
    return 0;
}
這種寫法比前兩個例子都來的精簡。函式指標陣列宣告的第一個void表示函式的回傳值,第二個void表示函式的參數。所以這是一個帶有三個函式指標的陣列,陣列中函式的回傳值以及參數都是void。

2 則留言:

  1. if (state >= 3) {
    printf("Wrong state!\n");
    return false;
    }
    應該要修改成這樣

    因為command[3](); 沒有定義.

    回覆刪除