Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Вызов подпрограмм из неуправляемой dllСодержание книги
Поиск на нашем сайте
Переменное число параметров Для указания того, что подпрограмма должна иметь переменное число параметров, используется ключевое слово params, за которым следует динамический массив. Например: function Sum(params a: array of integer): integer; При вызове подпрограммы на месте формального параметра params может быть любое ненулевое количество фактических параметров совместимого типа, перечисляемых через запятую: var s: integer := Sum(1,2,3,4,5); В списке параметров ключевое слово params может указываться только для последнего параметра, причем, этот параметр не должен быть параметром по умолчанию. Параметры params всегда передаются только по значению. Параметры по умолчанию В заголовке подпрограммы можно использовать параметры по умолчанию. Для этого достаточно после параметра поставить знак присваивания и значение. Если при вызове не указать значение параметра по умолчанию, то будет использовано то значение, которое указано в описании подпрограммы. Параметры по умолчанию должны передаваться по значению и идти последними в списке параметров. Например: procedure PrintTwo(a,b: integer; delim: char := ' '); ... Все варианты вызова подпрограммы с параметрами по умолчанию могут участвовать в разрешении перегрузки. Опережающее объявление В некоторых ситуациях возникает необходимость вызвать подпрограмму, описанную далее по тексту программы. Например, такая необходимость возникает при косвенной рекурсии (подпрограмма A вызывает подпрограмму B, а та в свою очередь вызывает подпрограмму A). В этом случае используется опережающее объявление подпрограммы, состоящее из ее заголовка, за которым следует ключевое слово forward. Например: procedure B(i: integer); forward;procedure A(i: integer);begin ... B(i-1);end;procedure B(i: integer);begin ... A(i div 2);end;Запрещено делать опережающее объявление для уже описанной подпрограммы. Для методов ключевое слово forward запрещено. При необходимости опережающего объявления нужные методы объявляются в теле класса, а описываются позже вне тела класса. Перегрузка имен подпрограмм В одном пространстве имен может быть определено несколько процедур или функций с одним именем, но разным количеством или типами параметров. Имена таких процедур и функций называются перегруженными, а их создание - перегрузкой. При вызове перегруженной процедуры или функции выбирается та версия, у которой типы формальных параметров совпадают с типами фактических или наиболее близки к ним. Например, если имеются описания procedurep(b: byte); то при вызове p(1.0) будет выбрана перегруженная версия с параметром типа real (точное соответствие), а при вызове p(1) будет выбрана перегруженная версия с параметром типа byte (при этом произойдет преобразование фактического параметра типа integer к типу byte). Заметим, что, в отличие от Object Pascal, использовать при перегрузке служебное слово overload не нужно. Если ни одна версия в текущем пространстве имен не подходит к данному вызову, то возникает ошибка компиляции. Если две и более версии одинаково хорошо подходят к данному вызову, то также возникает ошибка компиляции, заключающаяся в неоднозначности выбора подпрограммы. Например, если имеются описания procedurep(i: integer; r: real); то при вызове p(1,2) оба они одинаково подходят, что приводит к неоднозначности. Запрещено перегружать подпрограмму другой подпрограммой с тем же количеством и типами параметров, отличающихся лишь тем, передается ли параметр по значению или по ссылке. Например, описания procedure p(i: integer); и procedure p(var i: integer); считаются одинаковыми. Возвращаемое значение функции не участвует в разрешении перегрузки, т.е. перегружаемые функции не могут различаться только типами возвращаемых значений. Алгоритм перегрузки имен при наличии нескольких подключенных модулей, а также алгоритм перегрузки имен методов имеют особенности. Основная особенность этих алгоритмов состоит в том, что они работают через границы пространств имен. Поиск перегруженного имени глобальной подпрограммы при наличии нескольких подключенных модулей происходит во всех модулях. При этом вначале осуществляется просмотр текущего модуля, а потом всех модулей, подключенных в секции uses, в порядке справа налево. Если при этом поиске находится объект, который не может перегружать предыдущие (например, перегружается процедура, а найдено имя переменной), то цепочка перегрузки заканчивается, и поиск наилучшей перегруженной подпрограммы идет среди найденных до этого момента. Если в модуле, откомпилированном позже, имеется подпрограмма с точно такими же параметрами, то она скрывает версию из модуля, откомпилированного раньше. Например, пусть основная программа подключает два модуля - un1 и un2: main.pas uses un2,un1; procedure p(i: integer); begin un2.pas unit un2; procedure p(r: real); end. un1.pas unit un1; procedure p(r: real); end. В результате будет выведено 21, что означает, что первой была вызвана процедура p из модуля un1. Поиск перегруженного имени метода осуществляется аналогично: вначале осуществляется просмотр текущего класса, затем его базового класса и т.д. до класса Object, либо до того момента, как будет встречен объект, который не может перегружать предыдущие (имя поля или свойства). Из всех найденных таким образом одноименных методов выбирается наилучший. При этом в разных классах могут быть методы с идентичными параметрами; в этом случае вызывается первый встреченный метод от данного класса к классу Object. Подпрограммы с переменным числом параметров также участвуют в перегрузке, однако, обычные подпрограммы имеют над ними приоритет. Например, в ситуации procedure p(i: integer); procedure p(params a: array of integer); begin будет вызвана первая процедура. Для вызова подпрограммы из неуправляемой dll (содержащей обычный, а не .NET-код) используется конструкция вида: заголовок функции external 'имя dll' name 'имя функции в dll'; Например: function MessageBox(h: integer; m,c: string; t: integer): integer;
|
||||
Последнее изменение этой страницы: 2024-06-27; просмотров: 3; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.142.135.24 (0.006 с.) |