Возвращение массива в функции с переменным количеством параметров - C (СИ)
Формулировка задачи:
задание
Пoследoвaтeльнocть вещeствeнныx пoлoжитeльныx пеpeмeнных, ограничeннaя пeремeннoй co знaчeниeм -1. Функция вoзврaщaeт динaмичecкий мaссив, сoдержaщий знaчeния этих пeремeнныx.
То есть, как я понимаю, нужно переписать все входящие параметры в отдельный динамический массив. а после возвратить его (return массив). Но что-то я делаю не так, т.к. программа не работает.
#include <stdio.h> #include <stdlib.h> double max(double a, ...) { double *p = &a; /* указатель на значение параметра */ double *str = (double*)malloc(1024 * sizeof(double)); while (*p != -1) { *str = *p; /* перезаписываем в массив */ str++; /*переходим к следующему индексу в массиве*/ p++; /* переходим к следующемк параметру */ } /* возвращаем переписанные значенияв массиве*/ return *str; } void main() { printf("result = %.2f\n\n", max(100.5, 25.5, 30.76, 9.1, 22.45)); system("pause"); }
Решение задачи: «Возвращение массива в функции с переменным количеством параметров»
textual
Листинг программы
//gcc 5.4.0 #include <stdio.h> #include <stdlib.h> #include <stdarg.h> #define END_PARAM -1.0 double * f(double d, ...) { va_list argptr; va_start (argptr, d); size_t i = 0; double *arr = realloc(NULL, sizeof(double)); arr[i++] = d; while ((d = va_arg(argptr,double)) != END_PARAM) { arr = realloc(arr, sizeof(double) * (i+1)); arr[i++] = d; } arr = realloc(arr, sizeof(double) * (i+1)); arr[i] = END_PARAM; va_end(argptr); return arr; } int main(void) { double *arr = f(100.5, 25.5, 30.76, 9.1, 22.45, END_PARAM); for (size_t i=0; arr[i] != END_PARAM; i++) printf("%lf ", arr[i]); return 0; }
Объяснение кода листинга программы
- Включаем необходимые заголовочные файлы для работы с переменным числом аргументов и реализацией realloc.
- Определяем значение END_PARAM, которое будет использоваться в функции va_arg для определения конца списка аргументов.
- Определяем функцию f, которая принимает один обязательный аргумент типа double и переменное количество дополнительных аргументов.
- Используем va_start, чтобы инициализировать переменную argptr, которая будет использоваться для доступа к аргументам функции.
- Создаем переменную i для отслеживания количества добавленных элементов в массив.
- Выделяем память под массив из одного элемента.
- Добавляем первый аргумент в массив.
- В цикле while добавляем каждый следующий аргумент в массив, пока не достигнем конца списка аргументов.
- После цикла while добавляем END_PARAM в конец массива.
- Используем va_end, чтобы освободить ресурсы, выделенные под argptr.
- Используем realloc, чтобы выделить память под весь массив.
- Возвращаем массив из функции.
- В функции main вызываем функцию f с шестью аргументами.
- Используем цикл for для печати каждого элемента массива, пока не достигнем конца списка.
- Возвращаем 0, чтобы указать, что программа успешно завершилась.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д