调用此变量函数的替代方法

时间:2014-05-15 19:29:32

标签: c variadic

我编写了一个可变参数函数,它将第一个参数作为数字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])));

有更聪明的方法吗?

2 个答案:

答案 0 :(得分:2)

同时允许可变版本和阵列版本。

查看execlexecv的实施。

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.