Функции с переменным числом аргументов - 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);
Объяснение кода листинга программы
- Объявляется указатель на double тип данных ptr.
- В скобках идет приведение результата выражения (&CountArg+1) к типу double.
- Результат приведения (double)(&CountArg+1) присваивается указателю ptr.
- Указатель ptr содержит адрес памяти, где будет храниться значение CountArg+1, а именно адрес памяти следующего элемента после CountArg в памяти, выделенной под массив.