2012-09-23 75 views
3

使用函數指針數組有什麼好處? 除了減少C中函數原型的數量外。使用函數指針數組

+6

你的問題是相當模糊的。你能澄清你想問什麼嗎? –

+2

模糊的問題,恕我直言,你對減少函數原型的假設是錯誤的。 – Borgleader

+0

我建議你閱讀這個函數指針的使用:http://stackoverflow.com/questions/1758564/what-are-function-pointers-used-for-and-how-would-i-use-them因爲這個:http://www.eskimo.com/~scs/cclass/int/sx10b.html他們的數組將IMO,只是將它們組織在一起有用,以及可能允許你在循環中使用它們用迭代器。 – Annabelle

回答

2

存儲函數指針的數組(或其他數據結構)有多種用例。通常,這種類型的機制允許程序根據運行時標準動態調用幾個不同的函數之一。

例如,您可以使用一組函數指針來實現類似於OO語言的接口。該數組將持有指向該接口的每個實現的指針。根據某些標準,數組索引將用於選擇所需的實現。

1

一個例子(許多存在)是當你要實施一系列的變量「方法」:

typedef struct tag_IMAGEFORMAT 
{ 
     struct tag_IMAGEFORMAT *next; 
     const char  *name; 
     IMAGEDETECTOR *detect_routine; 
     int    (*open_routine)   (DISKIMAGE *img, diskimgflags_t flags); 
     size_t   (*read_routine)   (DISKIMAGE *img); 
     int    (*close_routine)  (DISKIMAGE *img); 
} IMAGEFORMAT; 

面向對象編程C.然後調用如object->open_routine(..),其實現可以在運行時動態更改(在此示例中,取決於圖像格式)。

在這個例子中,幾個圖像格式共享一個通用的API;各種「檢測器」依次運行,第一個匹配的指針將其指針複製到「通用圖像」對象。之後,您可以操作圖像而不用擔心它的實現細節(JPG,GIF,PNG等)。

類似地,如果需要實現的功能(例如圖像過濾器)的幾個不同的變化,則可以保留所有的指針到一個數組,並選擇合適的一個通過索引到陣列。

+1

答案中沒有數組。 –

+0

對不起,你是對的。我開始使用函數指針,並在運輸過程中迷失自我。 – LSerni

2

如果你想與操作數值,聯想可以使用函數指針數組,雖然它真的會被稱爲地圖。它可以節省大量的switch聲明。

array[CMD_OPEN] = OpenFunction; 
array[CMD_CLOSE] = CloseFunction; 

void HandleCommand(int aCommand) 
{ 
    array[aCommand](); 
} 
3

由於很多人指出的那樣,函數指針可以用來仿真C中的面向對象的編程

例如,適當的方法的選擇(也稱爲虛擬方法)可以使用簡單的索引來完成。

#include <stdio.h> 
#include <stdlib.h> 

typedef void (*menu_function_t)(); 

void menu_error() 
{ 
    printf("Invalid menu choice\n"); 
} 

void menu_exit() 
{ 
    exit(0); 
} 

void menu_function1() 
{ 
    printf("You have selected 1\n"); 
} 

void menu_function2() 
{ 
    printf("You have selected 2\n"); 
} 

menu_function_t menu_ptr[] = { 
    menu_function1, menu_function2, menu_exit, menu_error 
}; 

int menu_num = sizeof(menu_ptr)/sizeof(menu_ptr[0]); 

int validate_choice(int a) 
{ 
    if(a < 0 || a > menu_num - 2) { return 3; } 

    return a; 
} 

int main() 
{ 
    int choice = 0; 

    while(1) 
    { 
     printf("Choose item: \n"); 
     printf("0) Function 1\n"); 
     printf("1) Function 2\n"); 
     printf("2) Exit\n"); 
     scanf("%d", &choice); 

     menu_ptr[ validate_choice(choice) ](); 
    } 

    return 0; 
}