Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
s__ekzamen.docx
Скачиваний:
8
Добавлен:
18.12.2018
Размер:
113.34 Кб
Скачать

25.Функции и массивы

Смотри билеты: 15-19; 23-27

26. Функции с переменным числом параметров.

Если точное количество формальных аргументов функции изначально не известно, допускается указывать многоточие в списке аргументов:

void имя_функции(int first, float second, . . . ) ;

Данный прототип говорит компилятору о том, что за аргументами first и second могут следовать и другие аргументы, если возникнет такая необходимость. При этом тип последних не контролируется компилятором.

В следующей программе, написанной на языке С, создается функция vsmalltest( ) с переменным числом аргументов. Текст этой программы может вам показаться трудным для понимания, поскольку мы еще не рассматривали подробно работу с указателями.

В таком случае рекомендуем вернуться к этой программе после прочтения главы "Указатели".

/*

* ellipsis. с

* Эта программа на языке С содержит пример функции с переменным числом

* аргументов и демонстрирует использование макросов va_arg, va_startи va_end. */

#include ‹stdio.h›

#include ‹stdarg.h›

#include ‹string.h›

void vsmallest (char *szmessage, ...);

intmain() { vsmallest("Выводим %dцелых чисел, %d %d %d",10,4, 1);

return (0);

} void vsmallest (char *szmessage, ...) { int inumber_of_percent_ds = 0;

va_listtype_for_ellipsis;

int ipercent_d_format = 'd';

char *pchar; pchar = strchr (szmessage, ipercent_d_format) ;

while (*++pchar != '\0'){ pchar++; pchar = strchr (pchar, ipercent_d_format) ;

inumber_of_percent_ds++;

} printf{"Выводим%d целых чисел,",inumber_pf percent_ds) ;

va_start(type_for_ellipsis, szmessage);

while(inumber_of_percent_ds--) printf(" %d", va_arg(type_for_ellipsis, int));

va_end(type_for_ellipsis); }

Функция vsmallest() ожидает двух формальных аргументов: указателя на строку и списка неопределенной длины. Естественно, функция должна иметь возможность каким-то образом определить, сколько же аргументов она получила на самом деле. В данной программе эта информация передается в строковом аргументе.

Созданная нами функция vsmallest() частично имитирует работу стандартной функции printf (). Аргумент szmessage рассматривается как строка форматирования, в которой подсчитывается число спецификаций %d. Полученная информация позволяет вычислить количество дополнительных аргументов. Функция strchr() возвращает адрес позиции спецификатора d в строке форматирования. Первый элемент %d игнорируется, поскольку на его месте будет выведено общее число аргументов. В первом цикле while определяется количество спецификаторов d в строке szmessage, и полученное значение заносится в переменную inumber_of_percent_ds.

По завершении цикла на экран выводится первая часть сообщения. Макрос va_start() устанавливает указатель type_for_ellipsis(обратите внимание на его тип — va_list) в начало списка аргументов функции. Второй параметр макроса является именем обязательного аргумента анализируемой функции, который стоит непосредственно перед многоточием. Макрос va_arg() возвращает очередной аргумент из списка.

Второй параметр макроса указывает на тип возвращаемого аргумента (в нашей программе это тип int). Макрос va_end() очищает указатель type_for_ellipsis, делая его равным нулю.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]