我编写了一个可变参数函数,它将第一个参数作为数字N,然后作为接下来的N个参数,它采用类型为double
的N个变量。此外,此函数返回这N个变量的总和。
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
double foo(int arg_count, ...)
{
va_list ap;
int i;
double sum = 0;
va_start(ap, arg_count);
for (i = 0; i < arg_count; i++) {
sum += va_arg(ap, double);
}
va_end(ap);
return sum;
}
int main(void)
{
int n, i;
double *p, rez;
printf("N= ");
scanf("%d", &n);
p = (double *) calloc(n, sizeof(double));
if (p == NULL) {
exit(EXIT_FAILURE);
}
for (i = 0; i < n; i++) {
printf("p[%d]= ", i);
scanf("%lf", &p[i]);
}
printf("\n%lf\n", (rez = foo(n, p[0], p[1], p[2])));
free(p);
return 0;
}
但是,例如,此程序仅返回double *p
的前3个元素的总和,而不管N的值(由int n
保持)。
如果我希望它返回前10个元素的总和,那么我必须重新编写上面的代码......
printf("\n%lf\n", (rez = foo(n, p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7], p[8], p[9])));
有更聪明的方法吗?
答案 0 :(得分:2)
同时允许可变版本和阵列版本。
查看execl
和execv
的实施。
execl
接受以NULL结尾的可变参数,而execv
接受一个参数数组(以NULL指针结尾)。
这可以扩展到您的示例。
fool(n, p[0], p[1], p[2]);
和
foov(n, p);
但不是以NULL结尾,而是使用n
来指定参数的数量。
答案 1 :(得分:1)
使用常规函数并将数组作为参数传递。
double foo(int arg_count, double p[])
{
int i;
double sum = 0;
for (i = 0; i < arg_count; i++) {
sum += p[i];
}
return sum;
}
double sum1 = foo(3, p);
// Sum of the first 3 elements.
double sum2 = foo(10, p);
// Sum of the first 10 elements.