如何在C中制作动态的while循环程序?

时间:2019-05-06 10:17:48

标签: c

如何在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循环程序只能接受一种类型的函数。 则它不是完全动态的。 我该如何解决这个问题?如何使它接受各种功能? 欢迎任何意见。谢谢。

3 个答案:

答案 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类型。

是的,因为否则,参数将是什么?换句话说,您的fun1fun2不带参数。如果要调用带有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。 希望对您有帮助