Информатика и технология программирования


Вызов функцииФункции с переменным количеством параметров - часть 2


Пример функции, работающей с параметром -счетчиком.


int sum(int n,...) // n - счетчик параметров


{ int s,*p; // Указатель на область параметров


p = &#38n+1; // назначается на область памяти


for (s=0; n &#62 0; n--) // вслед за счетчиком n


s += *p++;
return(s); }
void main(){ cout &#60&#60 sum(5,0,4,2,56,7) + sum(2,6,46); }

Пример функции, работающей с параметром -ограничителем.


int sum(int a,...)
{ int s,*p; // Указатель на область параметров


p = &#38a; // назначается на первый параметр


for (s=0; *p &#62= 0; ) // из переменного списка


s += *p++; // Ограничитель - отрицательное


return(s); // значение


}
void main() { cout &#60&#60 sum(0,4,2,56,7,-1) + sum(6,46,-1) ;}

Если в списке предполагается наличие параметров различных типов, то типы их должны быть переданы в функцию отдельной спецификацией (подобно форматной строке функции printf). В этом случае область фактических параметров представляет собой память, в которой последовательность типов переменных заранее не определена (см п.4.4). С такой памятью можно работать только используя явное преобразование типа указателя к типу той переменной, которая в данный момент под ним находится. Операция *p++ по отношению к каждому типу указателя будет выполнять чтение из памяти переменной соответствующего типа с переходом к началу следующей:


//------------------------------------------------------bk45-01.cpp


&#35include &#60stdio.h&#62
int printf(char *s,...)
{
int ii;
double dd;
char * p,*ss;
p = &#38s+1; // Указатель на начало списка параметров


while (*s != '\0') // Просмотр форматной строки


{
if (*s != '%')
putchar(*s++); // Копирование форматной строки


else
{ s++; // Спецификация параметра вида "%d"


switch(*s++)
{ // Извлечение параметра и переход к следующему


case 'c': puchar(*p++);
break;
case 'd': ii = *((int*)p)++;
break; // Преобразование и вывод целого


case 'f': dd = *((double*)pd)++;
break; // Преобразование и вывод плавающего


case 's': ss = *((char**)ps)++;



Начало  Назад  Вперед



Книжный магазин