我有一个很长时间循环的代码。在这个while循环中,有一个很长的switch-case函数,以便知道应该在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循环之前定义要在foo
上应用的唯一函数bar
会更聪明,但是我可以对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循环中的正确函数吗?
答案 0 :(得分: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;
}
答案 1 :(得分:1)
在这里,函数指针是量身定制的,以解决这类挑战。您将定义正常函数foo1
,foo2
以及您可能需要的其他函数。然后,使用语法function pointer
定义return type (*fpointername)(arg, list);
您的arg
,list
参数只是要分配的函数的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]