Разработать функцию с переменным количеством параметров - C (СИ)
Формулировка задачи:
Разработать функцию с переменным количеством параметров. Для извлечения параметров из списка использовать технологию программирования областей памяти переменного формата.
10. Последовательность вещественных массивов. Сначала идет целый параметр - размерность массива (int), затем указатель на массив значений типа double (имя массива). Значение целого параметра - 0 обозначает конец последовательности. Функция возвращает сумму всех элементов.
http://www.cyberforum.ru/attachment....1&d=1461389978
Где здесь ошибки? И как правильно? Помогите, пожалуйста!
#include <stdio.h>
#include <conio.h>
#define N 100
double *d;
int A[N];
double sum(double n, ...)
{
int i;
double s;
double *p;
p = &n;
for (i = 0, d = (double*)A; i < N / sizeof(double); i++)
{
d[i] = (double)i;
}
for(s = 0; n > 0; n--)
{
s += *p++;
}
return s;
}
void main()
{
printf("%f", sum(0.5, 2.3, 12.9, 15.35));
_getch();
}Решение задачи: «Разработать функцию с переменным количеством параметров»
textual
Листинг программы
#include <stdio.h>
#include <stdarg.h>
double test(int len, ...)
{
double sum = 0.0;
int i = 0;
double* ptr = NULL;
va_list vl;
va_start(vl, len);
ptr = va_arg(vl, double*);
while (ptr != NULL)
{
printf("Array @ 0x%p:\n", ptr);
for (i = 0; i < len; i++)
{
printf("%0.3f ", ptr[i]);
sum += ptr[i];
}
printf("\n\n");
ptr = va_arg(vl, double*);
}
va_end(vl);
return sum;
}
int main(void)
{
double d[] = {1.45, 2.43, 0.0, 4.7, 5.6};
double q[] = {1.0, 2.0, 3.0, 4.0, 5.0};
double z[] = {0.45, 21.0, 37.0, 44.0, 56.999};
printf("sum = %0.4f\n", test(sizeof(d) / sizeof(*d), d, q, z, NULL));
return 0;
}
Объяснение кода листинга программы
- В функции
testобъявлен переменный список аргументов типаdouble* - Инициализируется переменная
sumсо значением 0.0 - Инициализируется переменная
iсо значением 0 - Инициализируется переменная
ptrсо значением NULL - Используется функция
va_startдля инициализации списка аргументов - Переменная
ptrполучает первый аргумент из списка аргументов - В цикле
whileпроисходит обработка каждого массива, полученного из списка аргументов - Для каждого массива выводится его содержимое с помощью цикла
for - К каждой итерации цикла
forприбавляется значение элемента массива к переменнойsum - После обработки всех массивов, функция
va_endосвобождает ресурсы, занятые функциейva_start - Функция возвращает значение переменной
sum - В функции
mainобъявлены три массиваd,qиzтипаdouble* - Вызывается функция
testс первым аргументом - размер массиваdв байтах, и остальными аргументами - массивыd,qиz - Результат работы функции
testвыводится на экран с помощью функцииprintf - Возвращается 0, что означает успешный конец работы программы