Главная » Delphi » Передача параметров

0

Pascal  позволяет передавать параметры в функции и процедуры либо  по значе нию (by value),  либо  по ссылке (by reference). Передаваемый параметр может  иметь любой  встроенный или  пользовательский тип  либо  являться открытым массивом (они  рассматриваются в этой  главе  далее).  Параметр также  может  быть  констан той,  если его значение в процедуре или функции не изменяется.

по значению

Этот режим  передачи параметров принят по умолчанию. Если параметр передается по значению, создается локальная копия  данной переменной, которая и предоставляет ся для обработки в процедуру или функцию. Рассмотрим следующий пример:

procedure Foo(s: string);

При  вызове  указанной процедуры будет создана  копия  передаваемой ей в качестве параметра строки s, с которой и будет работать процедура Foo(). При  этом  все вне сенные в переданную строку изменения никак не отразятся на исходной строке s.

по ссылке

Pascal позволяет также  передавать параметры в функции или  процедуры по ссыл ке — такие  параметры называются переменными параметрами (variable parameter), или var параметрами. Передача параметра по ссылке  означает, что функция или процеду ра сможет  изменять значения полученных параметров. Для передачи параметров по ссылке  используется ключевое слово  var, помещаемое в список  параметров процеду ры или функции:

procedure ChangeMe(var x: longint);

begin

x := 2;

{ теперь в процедуре можно изменить исходный x }

end;

1 Рекурсия — вызов себя самого — Прим. ред.Вместо  создания копии переменной х ключевое слово var требует  передачи адреса самой переменной х, что позволяет процедуре непосредственно изменять ее значение.

Для передачи параметров по ссылке в языке  C++ используется оператор &.

Параметры константы

Если нет необходимости изменять передаваемые функции или процедуре данные, то можно  описать параметр как константу. Ключевое слово  const не только  защища ет параметр от изменения, но и позволяет компилятору создать  более  оптимальный код для переданных строк  и записей. Вот пример объявления параметра константы:

procedure Goon(const s: string);

Использование открытых массивов

Открытый массив  параметров позволяет передавать в функцию или  процедуру  раз личное количество параметров. В качестве параметра можно  передать либо  открытый массив элементов одинакового типа,  либо массив констант различного типа.  В приведен ном ниже  примере объявляется функция, которой в качестве параметра должен  переда ваться открытый массив целых чисел:

function AddEmUp(A: array of Integer): Integer;

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

Var

i, Rez: Integer;

const

j = 23;

begin

i := 8;

Rez := AddEmUp([i, 50, j, 89]);

Чтобы работать с открытым массивом  внутри  функции или процедуры, необходи ма информация о нем.  Получить информацию об открытом массиве  можно  с помо щью функций High(), Low() и SizeOf(). Для иллюстрации их использования ниже приведен код  функции  AddEmUp(), которая возвращает сумму всех  переданных ей элементов массива А.

function AddEmUp(A: array of Integer): Integer;

var

i: Integer;

begin

Result := 0;

for i := Low(A) to High(A) do inc(Result, A[i]);

end;

Object  Pascal поддерживает также  тип array of const, который позволяет пере давать  в одном  массиве  данные различных типов.  Для объявления функций и проце дур, использующих в качестве параметра такой  массив,  применяется следующий  син таксис:procedure WhatHaveIGot(A: array of const);

Объявленная выше функция допускает даже такой синтаксис вызова:

WhatHaveIGot([‘Tabasco’, 90, 5.6, @WhatHaveIGot,

3.14159, True, ‘s’]);

Компилятор  автоматически конвертирует  переданный функции  или  процедуре массив констант в тип TVarRec, объявленный в модуле System следующим образом:

type

PVarRec = ^TVarRec;

TVarRec = record

case Byte of

vtInteger:             (VInteger: Integer; VType: Byte);

vtBoolean:             (VBoolean: Boolean);

vtChar:                (VChar: Char);

vtExtended:            (VExtended: PExtended);

vtString:              (VString: PShortString);

vtPointer:             (VPointer: Pointer);

vtPChar:               (VPChar: PChar);

vtObject:              (VObject: TObject);

vtClass:               (VClass: TClass);

vtWideChar:            (VWideChar: WideChar);

vtPWideChar:           (VPWideChar: PWideChar);

vtAnsiString: (VAnsiString: Pointer);

vtCurrency:            (VCurrency: PCurrency);

vtVariant:             (VVariant: PVariant);

vtInterface:           (VInterface: Pointer);

vtWideString: (VWideString: Pointer);

vtInt64:               (VInt64: PInt64);

end;

Поле   VType определяет  тип  содержащихся  в  этом  экземпляре  записи  данных

TVarRec и может принимать одно из приведенных ниже значений.

const

{ Значения TVarRec.VType }

vtInteger         = 0;

vtBoolean         = 1;

vtChar            = 2;

vtExtended        = 3;

vtString          = 4;

vtPointer         = 5;

vtPChar           = 6;

vtObject          = 7;

vtClass           = 8;

vtWideChar        = 9;

vtPWideChar       = 10;

vtAnsiString = 11;

vtCurrency        = 12;

vtVariant         = 13;

vtInterface       = 14;

vtWideString = 15;

vtInt64   = 16;Поскольку массив  констант (тип  array of const) способен передавать данные различных типов, это может  вызвать определенные затруднения при  создании обраба тывающей полученные параметры функции или процедуры. В качестве примера работы с таким  массивом  рассмотрим реализацию процедуры WhatHaveIGot(), которая про сматривает элементы полученного массива параметров и выводит их тип на экран.

procedure WhatHaveIGot(A: array of const);

var

i: Integer;

TypeStr: string;

begin

for i := Low(A) to High(A) do begin

case A[i].VType of

vtInteger             : TypeStr := ‘Integer';

vtBoolean             : TypeStr := ‘Boolean';

vtChar                : TypeStr := ‘Char';

vtExtended            : TypeStr := ‘Extended';

vtString              : TypeStr := ‘String';

vtPointer             : TypeStr := ‘Pointer';

vtPChar               : TypeStr := ‘PChar';

vtObject              : TypeStr := ‘Object';

vtClass               : TypeStr := ‘Class';

vtWideChar            : TypeStr := ‘WideChar';

vtPWideChar           : TypeStr := ‘PWideChar';

vtAnsiString : TypeStr := ‘AnsiString';

vtCurrency            : TypeStr := ‘Currency';

vtVariant             : TypeStr := ‘Variant';

vtInterface           : TypeStr := ‘Interface';

vtWideString : TypeStr := ‘WideString';

vtInt64               : TypeStr := ‘Int64′;

end;

ShowMessage(Format(‘Array item %d is a %s’, [i, TypeStr]));

end;

end;

Источник: Тейксейра, Стив, Пачеко, Ксавье.   Borland Delphi 6. Руководство разработчика. : Пер.  с англ. — М. : Издательский дом “Вильямс”, 2002. —  1120 с. : ил. — Парал. тит. англ.

По теме:

  • Комментарии