2014-10-27 66 views
0

我有一個很長的while循環代碼。在這個while循環中,爲了知道bar上應該應用哪個函數,有一個長開關函數功能。有條件的函數定義

int i=0; 
while(i<BigNumber) 
{ 
    switch(variable) 
    { 
     case 1: 
      foo1(bar); 
     case 2: 
      foo2(bar); 
     etc... 
    } 
    i = i+1; 
} 

但是,從一次迭代到另一個while循環,switch-case結構中的情況總是相同的。因此,我認爲在while循環之前定義一個適用於bar的獨特函數foo會更加明智,但是我可以使這個條件定義爲foo?類似於

switch(variable) 
{ 
    case 1: 
     define foo this way 
    case 2: 
     define foo that way 
    etc... 
} 

int i=0; 
while(i<BigNumber) 
{ 
    foo(bar); 
    i = i+1; 
} 

但是無法在main中定義函數,所以此代碼無法編譯。我該如何解決這個問題?有沒有什麼辦法來定義一個功能條件的東西?最好的解決方案包括製作一系列指向函數的指針,然後通過執行諸如(*myarray[variable])(bar)之類的操作,在while循環中調用正確的函數?

+1

沒有太大的不同,但你可以只創建一個單一的指針到函數的變量,並在switch語句外部給它分配你的while循環。沒有必要創建一個指針數組。 – happydave 2014-10-27 03:09:43

回答

1

這裏,函數指針是度身訂造,以解決這一類型的挑戰。您將定義您的正常功能foo1foo2,以及您可能需要的更多功能。然後,您使用語法return type (*fpointername)(arg, list);定義function pointer您的arglist參數只是要分配的功能的type。 (例如,如果你的職能void foo1 (int a, char b)那麼你聲明你的函數指針void (*fpointername)(int, char);(變量名中FN指針定義中省略)

下面是一個簡單的程序,說明了這一點放一個評論,如果您有任何問題:。

#include <stdio.h> 

/* 3 void functions, one of which will become foo 
* dependeing on the outcome of the switch statement 
*/ 
void foo1 (char c) { 
    printf ("\n %s(%c)\n\n", __func__, c); 
} 

void foo2 (char c) { 
    printf ("\n %s(%c)\n\n", __func__, c); 
} 

void foodefault (char c) { 
    printf ("\n %s(%c)\n\n", __func__, c); 
    printf (" Usage: program char [a->foo1, b->foo2, other->foodefault]\n\n"); 
} 

/* simple program passes argument to switch 
* statement which assigns function to function 
* pointer 'foo()' based on switch criteria. 
*/ 
int main (int argc, char **argv) { 

    void (*foo)(char) = NULL;    /* function pointer initialized to NULL */ 
    char x = (argc > 1) ? *argv[1] : 'c'; /* set 'x' value depending on argv[1] */ 

    switch (x)        /* switch on input to determine foo() */ 
    { 
     case 'a' :       /* input 'a'       */ 
      foo = &foo1;     /* assign foo as foo1     */ 
      break; 
     case 'b' :       /* input 'b'       */ 
      foo = &foo2;     /* assign foo as foo2     */ 
      break; 
     default :       /* default case assign foo foodefault */ 
      foo = &foodefault; 
    } 

    foo (x);        /* call function foo(x)     */ 

    return 0; 
} 

輸出:

$ ./bin/foofn 

    foodefault(c) 

    Usage: program char [a->foo1, b->foo2, other->foodefault] 

$ ./bin/foofn a 

    foo1(a) 

$ ./bin/foofn b 

    foo2(b) 

$ ./bin/foofn d 

    foodefault(d) 

    Usage: program char [a->foo1, b->foo2, other->foodefault] 
1

爲了詳細說明happydave的評論

void (*foo)(int); 

switch(variable) 
{ 
    case 1: 
     foo = foo1; // or foo = &foo1; // & is optional 
    case 2: 
     foo = foo2; 
    etc... 
} 

int i=0; 
while(i<BigNumber) 
{ 
    foo(bar); // (*foo)(bar); also works 
    i = i+1; 
}