如何在 C 中的 for 循环中访问 6 个不同的函数?

how to access 6 different functions within for loop in C?

我正在用 C 编写代码。我必须计算一些名为的系数:

k1, k2, k3, k4

我有 6 个不同的函数,命名为:

func1, func2, func3, .....func6

非常低效的方法是编写这样的代码:

/* find k1 for all 6 functions */

/* k[0][0] is k1 for func1 */
/* k[0][1] is k1 for func2 */
   ......
   ......
/* k[0][5] is k1 for func6 */

/* h is some constant */

            k[0][0] = h*func1()
            k[0][1] = h*func2()
            k[0][2] = h*func3()
            k[0][3] = h*func4()
            k[0][4] = h*func5()
            k[0][5] = h*func6()

同样,我必须找出所有 6 个函数的 k2。

同样非常低效的方法是:

        k[1][0] = h*func1()
        k[1][1] = h*func2()
        k[1][2] = h*func3()
        k[1][3] = h*func4()
        k[1][4] = h*func5()
        k[1][5] = h*func6()

其余 k3 和 k4 的类似情况是:

 /* find K3 for all 6 functions */
   .............
   .............
 /* find K4 for all 6 functions */
   .............
   .............

我想避免这一切。

我想要一种方法,以便我可以在 for 循环中为每个系数 k 调用 6 个函数。像这样:

for(i=0; i<=3; i++)
  {
     for(j=0; j<=5; j++)
       {
          k[i][j] =  h*func[...]
          /* where func[...] means some way for calling 6 functions */
       }
  }

可能是一些函数数组??

非常感谢任何帮助。

谢谢。

如果 所有 6 个函数都有相同的原型,我假设它们有 - 例如接收 void 和 returns int,那么你可以使用一个函数指针数组:

typedef int (*FUNCTION_PTR)(void);

FUNCTION_PTR funcs[6] = { func1, func2, ... };

for(i = 0; i <= 3; i++)
{
    for(j = 0; j <= 5; j++)
    {
        k[i][j] = h * func[j]();
    }
}

您可以声明指向相同类型函数的指针数组。有些人喜欢为此使用 typedefs,但您也可以直接声明数组。如果 f 是指向函数的指针,则可以使用 (*f)(...) 调用该函数,其中省略号表示参数。但您也可以使用 f(...).

调用该函数
#include <stdio.h>

double f1(int);
double f2(int);
double f3(int);
double f4(int);
double f5(int);
double f6(int);

int main(void)
{
    /* With typedef */
//    typedef double (*Fn_ptr)(int);
//    Fn_ptr funcs[6] = { f1, f2, f3, f4, f5, f6 };

    /* Without typedef */
    double (*funcs[6])(int) = { f1, f2, f3, f4, f5, f6 };

    double k[4][6];
    double h = 0.1;

    for (size_t i = 0; i < 4; i++)
    {
        for (size_t j = 0; j < 6; j++)
        {
            k[i][j] =  h*funcs[j](i);
        }
    }

    for (size_t i = 0; i < 4; i++)
    {
        for (size_t j = 0; j < 6; j++)
        {
            printf("%10f", k[i][j]);
        }
        putchar('\n');
    }

    return 0;
}

double f1(int x)
{
    return x + 1;
}

double f2(int x)
{

    return x + 2;
}

double f3(int x)
{
    return x + 3;
}

double f4(int x)
{
    return x + 4;
}

double f5(int x)
{
    return x + 5;
}

double f6(int x)
{
    return x + 6;
}