如何在C语言中创建动态的while循环程序?
因此,
if {
while
} else if {
while
} else {
while
}
我想让程序动态执行while循环。我做了两种方法。
第一:(不起作用)
#include <stdio.h>
#define aaa printf("0\n")
int main() {
int x = 1, i = 1;
if (x == 1) {
#undef aaa
#define aaa printf("1\n")
} else {
#undef aaa
#define aaa printf("2\n")
}
while (i <= 10) {
aaa;
i++;
}
return 0;
}
秒:(有效)
#include <stdio.h>
typedef void (*FunctionName)();
void fun1();
void fun2();
int main() {
int x = 1, i = 1;
FunctionName y;
y = (x == 1) ? fun1 : fun2;
while (i <= 10) {
y();
i++;
}
return 0;
}
void fun1() {
printf("1\n");
}
void fun2() {
printf("2\n");
}
但是,它只能接受相同类型的功能。在这种情况下,y()。 它不能同时接受两种或多种类型的功能。 例如:f1(a)和f2(a,b)。 因此,我必须将所有函数都设为同一类型,因为它不能接受diff类型。
此动态while循环程序只能接受一种类型的函数。 则它不是完全动态的。 我该如何解决这个问题?如何使它接受各种功能? 欢迎任何意见。谢谢。
答案 0 :(得分:1)
我不确定您要解决什么问题,但是您可以通过使用空指针发送参数来使其工作。
typedef void (*FunctionName)(void *);
然后(如果需要几个参数)为不同的功能创建不同的结构:
struct fooArgs {
int x;
double y;
char *s;
};
然后创建一个像这样的函数:
void foo(void *args) {
struct fooArgs *a = (struct fooArgs*)args;
int x = a->x;
double y = a->y;
char *s = a->s;
/* Do stuff */
}
您需要为参数编写类似于y = (x == 1) ? fun1 : fun2;
的内容。看起来可能像这样:
void *args;
struct fooArgs a = { 5, 6.7, NULL };
if(x == 1) {
y = foo;
args = a;
} else if (x == 2) {
y = bar;
args = NULL; // For a function without arguments;
}
while (i <= 10) {
y(args);
i++;
}
但是,我不建议您这样做,除非您真的确定自己在做什么。如果是为了性能,则增益可能会非常低,甚至可能使编译器优化器难以获得更好的性能。仅当您确实需要这些额外的毫秒数时,才使用此类功能作为绝对的最后手段。
答案 1 :(得分:1)
但是,它只能接受相同类型的功能。在这种情况下,y()。它不能同时接受两种或多种类型的功能。例如:f1(a)和f2(a,b)。因此,我必须将所有函数都设为同一类型,因为它不能接受diff类型。
是的,因为否则,参数将是什么?换句话说,您的fun1
和fun2
不带参数。如果要调用带有1个参数的fun3
,则参数是什么?
换句话说,考虑:
void fun3(int);
y = fun3;
y(???);
对于y
的某些值,您将必须传递不同数量的参数。相同的返回类型。
您需要做的是创建一个包装函数,该函数可以执行例如 partial application 的操作。 fun3
:
void g() {
fun3(42);
}
y = g;
y();
在这里,g
有责任了解fun3
的参数是什么(它们在本示例中可能是恒定的,或者来自其他地方)。
在支持用户定义类型(可能是OOP)的语言(例如C ++)中,一种典型的解决方案是创建一个“ Callable” 对象,该对象将参数存储为数据成员,并可被称为如果它是一个函数。
此外,在其中某些语言中,您会获得一些语法糖,可以轻松就地创建这些Callable对象,通常称为lambda或闭包。
答案 2 :(得分:1)
放置开关,或者在while循环中放置更复杂的条件:
while(i <= 10)
{
if(condition 1)
//call f1();
...
else if (condition n)
{
// call fn;
...
else
{
// nothing of the prevous cases
}
i ++
}
如果要与常量进行比较,还可以在while循环中使用swithch case
。
希望对您有帮助