Разработать функцию с переменным количеством параметров - 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, что означает успешный конец работы программы
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д