如何在 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]();
}
}
您可以声明指向相同类型函数的指针数组。有些人喜欢为此使用 typedef
s,但您也可以直接声明数组。如果 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;
}
我正在用 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]();
}
}
您可以声明指向相同类型函数的指针数组。有些人喜欢为此使用 typedef
s,但您也可以直接声明数组。如果 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;
}