Функции с переменным числом аргументов - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Дело было в дизеле после университета. Хотел написать функцию, в которой заранее не будет известно, сколько будет аргументов, но ничего не вышло, дальше первого объявленного аргумента лезть не могу и не понимаю, как вручную обращаться к переменным аргументам. Использовал макросы, и всё получилось. Принцип работы понимаю, но как вручную сделать не понимаю. Можете пояснить, как это сделать? Пример кода:
#include <stdio.h>
#include <stdarg.h> // библиотека для работа с макросами для функции с переменных числом аргументов
#include <malloc.h>
 
float MaxD( int CountArg, ...); // прототип функции
int main(void)
{
 float Max = MaxD( 7, 4.1, 4.2, 4.3, 4.4, 4.5, 100.0, 4.6);
 printf( "%2.1lf" , Max);
 return 0;
}
float MaxD( int CountArg, ...)
{
   int i;
   float MaxValue;
   float *array = (float*)malloc(sizeof(float)*CountArg);
   va_list arglist; // переменная arglist указывает на список аргументов
   va_start( arglist, CountArg );// указатель ставим на аргумент, следующий за аргументом CountArg
   for ( i = 0; i < CountArg; i++)
    array[i] = va_arg(arglist, double); // присваиваем значение аргументов в переменные динамического массива
    va_end(arglist);
    i = 0;
    MaxValue = array[i];
   for( i = 1; i < CountArg; i++)
    if( MaxValue < array[i]) MaxValue = array[i];
    return MaxValue;
}

Решение задачи: «Функции с переменным числом аргументов»

textual
Листинг программы
double* ptr = (double*)(&CountArg+1);

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

  1. Объявляется указатель на double тип данных ptr.
  2. В скобках идет приведение результата выражения (&CountArg+1) к типу double.
  3. Результат приведения (double)(&CountArg+1) присваивается указателю ptr.
  4. Указатель ptr содержит адрес памяти, где будет храниться значение CountArg+1, а именно адрес памяти следующего элемента после CountArg в памяти, выделенной под массив.

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


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

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

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