Возвращение массива в функции с переменным количеством параметров - 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;
}

Объяснение кода листинга программы

  1. Включаем необходимые заголовочные файлы для работы с переменным числом аргументов и реализацией realloc.
  2. Определяем значение END_PARAM, которое будет использоваться в функции va_arg для определения конца списка аргументов.
  3. Определяем функцию f, которая принимает один обязательный аргумент типа double и переменное количество дополнительных аргументов.
  4. Используем va_start, чтобы инициализировать переменную argptr, которая будет использоваться для доступа к аргументам функции.
  5. Создаем переменную i для отслеживания количества добавленных элементов в массив.
  6. Выделяем память под массив из одного элемента.
  7. Добавляем первый аргумент в массив.
  8. В цикле while добавляем каждый следующий аргумент в массив, пока не достигнем конца списка аргументов.
  9. После цикла while добавляем END_PARAM в конец массива.
  10. Используем va_end, чтобы освободить ресурсы, выделенные под argptr.
  11. Используем realloc, чтобы выделить память под весь массив.
  12. Возвращаем массив из функции.
  13. В функции main вызываем функцию f с шестью аргументами.
  14. Используем цикл for для печати каждого элемента массива, пока не достигнем конца списка.
  15. Возвращаем 0, чтобы указать, что программа успешно завершилась.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

9   голосов , оценка 4.222 из 5
Похожие ответы