переменное число аргументов си++ = ПЕРЕМЕННОЕ число аргументов функции си++
Primary tabs
хорошая статья на тему - http://www.rsdn.ru/forum/cpp/418970.1.aspx
Краткий конспект:
Список параметров совсем пустой быть не может, должен быть прописан хотя бы один явный параметр, адрес которого мы можем получить при выполнении программы. Заголовок такой функции может выглядеть так:
int f(int k...);
Ни запятая, ни пробел после параметра не обязательны, хотя можно их и прописать.
Попробуем написать функцию, вычисляющую среднее арифметическое своих аргументов. Для этого требуется решить несколько проблем
- как установиться на список параметров в стеке;
- как «перебирать» параметры;
- как закончить перебор
Для доступа к списку параметров нам потребуется указатель, значением которого будет адрес последнего явного параметра в списке.
Ответ на второй вопрос очевиден – надо изменять значение этого указателя, чтобы переместиться на следующий параметр. Отсюда следует, что указатель должен быть типизированным, поскольку с бестиповым указателем нельзя выполнять арифметические операции.
Это же означает, что программист при разработке функции с переменным числом параметров должен отчетливо себе представлять типы аргументов, которые будет обрабатывать функция. Кроме того, способ передачи параметров должен быть одинаковым для всех параметров:
- либо все – по значению
- либо все – по ссылке
- либо все – по указателю
Ответ на последний вопрос не вызывает затруднений - это можно сделать одним из двух способов:
- явно передать среди обязательных параметров количество аргументов;
- добавить в конец списка аргумент с уникальным значением, по которому будет определяться конец списка параметров;
И тот, и другой способ имеют право на жизнь — все определяется потребностями задачи и вкусами программиста. В данном случае сначала попробуем второй способ: последним значением списка параметров будет ноль (листинг 7.7).
Листинг 7.7. Вычисление среднего арифметического аргументов (ноль в конце)
double f(double n, ...) //--заголовок с переменным числом параметров { double *p = &n; //--установились на начало списка параметров double sum = 0, count = 0; while (*p) //--пока аргумент не равен нулю { sum+=(*p); //--суммируем аргумент p++; //--«перемещаемся на следующий аргумент count++; //--считаем количество аргументов } return ((sum)?sum/count:0); //--вычисляем среднее }
Вызов такой функции может выглядеть таким образом:
double y = f(1.0, 2.0, 3.0, 4.0, 0.0);
Если в функцию передаётся переменное число строк , то полезно изучить и этот пример.
ПРИМЕЧАНИЕ = Также можно "перешагивать" и переменное число байт - просто время от времени приводя указатель к нужному типу (фактически - передавать переменное число аргументов разного типа) - как это сделано в следующем примере (реализация fprintf)
- Log in to post comments
- 4894 reads