Основы программирования для автоматизированного проектирования и решения творческих задач. Романенко А.В - 34 стр.

UptoLike

Составители: 

П р и м е р 37
double integral(double (*f)(double), double a, double b, double h)
{
double S = (f(a) + f(b)) * h / 2;
for (a += h; a < b; a += h) S += f(a) * h;
return S;
}
Указатель на функцию как возвращаемое функцией значение. Возможна такая организация программы, когда выпол-
няемые действия определяются не в точке исполнения, а в некоторой "промежуточной" функции. В этом случае промежу-
точная функция должна вернуть в вызвавшую ее функцию в качестве результата адрес той функции, которая должна быть
выполнена. Такой адрес можно возвратить в виде значения указателя на функцию. Прототип такой функции выглядит сле-
дующим образом:
тип (*имя(формальные_параметры1))(формальные_параметры2);
В вызывающей функции необходимо предусмотреть указатель, способный принять такой адрес.
П р и м е р 38
double (*variant(double))(int i)
{
switch (i)
{
case 1: return sin;
case 2: return cos;
default: return NULL;
}
}
int main()
{
double (* p)(double);
p = variant(1);
if (p != NULL) printf("%g", p(3.14));
return 0;
}
13.4 Функции с переменным числом параметров
В языке С существует возможность создавать функции, у которых во время компиляции список формальных парамет-
ров не определен и даже неизвестны типы данных, к которым могут принадлежать передаваемые параметры. Типы парамет-
ров и их количество становится известным в процессе выполнения программы. При определении и описании таких функций
список формальных параметров должен заканчиваться запятой и многоточием:
тип имя(список_явных_параметров, ...);
здесь список явных параметровсписок параметров, тип и количество которых известны на момент компиляции.
Многоточие означает для компилятора, что контроль количества и типов параметров при обращении к функции прово-
дить не надо. Главная сложность при работе со списком параметров переменной длины состоит в том, что он не имеет име-
ни, поэтому неизвестно его начало в оперативной памяти. Для определения начала списка параметров переменной длины
необходимо, чтобы функция имела хотя бы один явный параметр.
Для нормальной работы со списком параметров переменной длины, функции прямо или косвенно необходимо опреде-
литься с длиной списка (количеством элементов в нем в данный момент). Существуют две идеи, объясняющие как выйти из
сложившейся ситуации. Можно напрямую передавать функции число параметров в списке. Другим способом является по-
мещение в конец списка признака его окончания. В этом случае функция должна проверять наличие в списке кода окончания
списка. Выборка элементов из списка осуществляется с помощью указателей. Рассмотрим в качестве примера функцию для
подсчета суммы целых чисел.
П р и м е р 39
Явная передача в функцию числа параметров
long sum(int n, ...)
{
int *p = &n;
long s = 0;
for ( ; n; n--) s += *(++p);
return s;