Функции с переменным числом аргументов - 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 в памяти, выделенной под массив.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д