Компьютерные книги
Главное меню
Главная Поиск по сайту Добавить материал О нас Карта книг Карта сайта
Реклама
computersbooks.net -> Добавить материал -> Языки программирования -> Марченко А.Л. -> "С++ бархатный путь " -> 55

С++ бархатный путь - Марченко А.Л.

Марченко А.Л. С++ бархатный путь — М.: Горячая линия - Телеком, 2005. — 399 c.
ISBN 5-93517-056-6
Скачать (прямая ссылка): barhatniyput2005.djvu
Предыдущая << 1 .. 49 50 51 52 53 54 < 55 > 56 57 58 59 60 61 .. 152 >> Следующая

Если же параметр был определён как параметр без имени, то существует единственный способ доступа к таким параметрам — доступ с помощью указателей.
Если предположить, что все означенные параметры, с именами и безмянные, занимают одну непрерывную область памяти. Поэтому для доступа к элементам этого списка достаточно знать имя и тип хотя бы одного параметра. Для этого в функции определяется указатель, которому с помощью операции взятия адреса присваивается значение, которое соответствует адресу именованного параметра. Переход от параметра к параметру при этом обеспечивается с помощью операций адресной арифметики над значением этого указателя.
С точки зрения реализации все очень просто. Если бы не одно обстоятельство, которое заметно ограничивает свободу применения подобных функций.
Дело в том, что всякий раз при создании функций с неопределённым количеством параметров, мы вынуждены разрабатывать алгоритм доступа к списку этих самых параметров. А для этого необходимо, по крайней мере, представлять закономерность расположения параметров в списке. Так что список необъявленных параметров не может состоять из подобранных случайным образом элементов, поскольку не существует универсальных средств распознавания элементов этого списка. На практике дело обычно ограничивается несколькими тривиальными вариантами.
140
При этом либо известен тип и количество передаваемых параметров, и процедура доступа к параметрам сводится к примитивному алгоритму, который воспроизводится в следующем примере:
tincluda <ioetream.h>
long PP(int n, . . .) ;
void main (void)
(
long RR;
RR «• PP(5, 1, 2, 3, 4, 5 );
/* Вызвали функцию с 6 параметрами. Единственный обязательный параметр определяет количество передаваемых параметров. */
cout « RR « endl;
1
long PP(int n ...)
і
int ‘pPointer - in;
// Настроились на область памяти с параметрами... int Sum - 0;
for ( ; n; n—) Sum +« *<++pPointar): return Sum;
)
Либо известен тип элементов списка и признак завершения списка передаваемых параметров. Процедура доступа к параметрам также проста. как и в первом случае:
(include <iostream.h> long FP(int pari ...); void main (void)
<
long RR;
RR - PP( 1, 2, 0, 4, 0 );
t* Вызвали функцию с 5 параметрами. Единственный обязательный параметр - первый параметр в списке параметров. */
cout « RRR « endl:
)
long PP(int pari ...)
{
int *pPointer - tparl;
141
/* Настроились на область паняти с параметрами. Признак конца списка - параметр с кулевым значением, */
int Sum “ 0;
for ( ; *pPointer !“ 0; pPointer++! Su» += *pPointar /* Что-то здесь ив так.. Мы так и не обработали до конца весь список. */
return Sun;
)
Размещение параметров
Помимо ограничений, связанных с алгоритмами доступа к параметрам, реализация функций с переменным количеством параметров осложняется также рядом дополнительных обстоятельств, которые требуют особого внимания.
При вызове функции значения её параметров помещаются в стек. При этом порядок размещения параметров в стеке зависит от реализации компилятора и от опций, позволяющих управлять размещением значений параметров.
Так. стандартное размещение параметров предполагает, что значение последнего параметра размещается самым первым, а значение первого - самым последним. При вызове функции этот параметр, извлекается из стека в первую очередь.
Вместе с тем, в Borland C++ существует возможность изменения порядка размещения значений параметров. Опция -р в командной строке
компилятора, модификатор______pascal в объявлении конкретной функции
или соответствующий выбор пункта меню диалога Options Project приводит к изменению порядка расположения значений параметров. Значение первого параметра попадает в стек первым и извлекается последним. В этом случае функции с переменным количеством параметров могли бы использоваться лишь при условии, что всякий раз последним параметром будет параметр, содержащий информацию по крайней мере о количестве параметров в списке. Но это слишком жёсткое требование. И потому невыполнимое. Многоточие в прототипе ипи определении функции в этом случае воспринимается как ошибка.
При определении функций с переменным количеством параметров, стандартом языка рекомендуется использовать специальный набор макроопределений, которые становятся доступными при включении в программу заголовочного файла stdarg.h. При этом облегчается переносимость программ с одной платформы на другую (платформа определяется типом компьютера и операционной системы.)
Эти макроопределения обеспечивают простой и стандартный (не зависящий от реализации) способ доступа к спискам параметров переменной длины и имеют следующий формат:
142
void va_etart (va_list ap, lastarg);
Первый “параметр" этого макроопределения имеют специальный тип vajist, который используется для представления списков параметров неизвестной длины и состава. Макроопределение va_start вызывается непосредственно перед началом работы с неименованными параметрами. В результате вызова этого макроопределения ‘’параметр" ар инициализируется указателем на последний именованный параметр в списке с переменным числом параметров — “параметр' lastarg.
Предыдущая << 1 .. 49 50 51 52 53 54 < 55 > 56 57 58 59 60 61 .. 152 >> Следующая
Книги
Web-программирован-
ие
Аппаратное обеспечение Графика Руководство по П.О. Самоучитель Теория программирования Фотошоп Языки программирования
Новые книги
Вирт Н. "Систематическое программирование " (Теория программирования)

Эком "Microsoft Excel 2000 шаг за шагом Русская версия самоучитель " (Самоучитель)

Поляков А.Ю. "Методы и алгоритмы компьютерной графики в примерах Vizual C++" (Графика)

Баяковский Ю.М. "Графическая библиотека Open GL " (Графика)

Валиков А. "Технология " (Языки программирования)
Авторские права © 2013 ComputersBooks. Все права защищены.