Возвращение массива в функции с переменным количеством параметров - 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, чтобы указать, что программа успешно завершилась.