Открытые массивы

Открытые параметры

Совмещение в памяти

Явное преобразование типа

Нетипизированные параметры

 

В объявлении подпрограммы можно не указывать тип параметра-переменной:

 

procedure proc5(var x);

 

Такой параметр будет называться нетипизированным. В этот параметр можно передать аргумент, относящийся к любому типу данных.

 

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

 

 

При помощи операции явного преобразования типа данных (см. лекцию 2) можно преобразовать нетипизированное значение, относящееся к нужному типу данных. Например, в процедуре proc5 значение одного и того же параметра х интерпретируется тремя разными способами: как целое число, как вещественное число и как массив:

 

procedure proc5(var x);

type arr = array[1..10] of byte;

var x: integer;

z: real;

m: arr;

begin

...

y:= integer(x);

z:= real(x);

m:= arr(x);

...

end;

 

 

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

 

<локальная_переменная>: <тип> absolute <нетипизир_параметр>;

 

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

 

function func5(var x):real;

var xxx: longint absolute x;

begin

{здесь с началом любой переменной,

поступившей в параметр х,

... можно обращаться как с longint-числом:

при помощи локальной переменной ххх}

end;

 

 

Открытые параметры - это массивы и строки неопределенной длины. Открытым параметром может стать только параметр-переменная. Возможность работать с открытыми параметрами в подпрограммах появилась в версии Turbo Pascal 7.0.

 

 

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

 

В заголовке подпрограммы открытый параметр-массив описывается по следующему шаблону:

 

var <имя_параметра>: array of <тип_компонентов_массива>

 

Например, если описано

 

procedure proc6 (var a: array of byte);

 

то аргументом могут стать такие массивы:

 

a1: array[1..100] of byte;

a2: array[-10..10] of byte;

a3: array[1..2,1..3] of byte;

 

Компоненты открытого параметра-массива нумеруются начиная с нуля - этим достигается единообразие обращения к массивам переменной длины.

 

Если в качестве аргумента поступил многомерный массив, его компоненты "вытягиваются" в одну строку: сначала все компоненты первой строки массива, затем - второй строки и т.д. Например, если массив а3 имеет значения

 

1 2 3

4 5 6

 

то внутри процедуры proc6 параметр а будет иметь уже следующий вид:

 

1 2 3 4 5 6

 

причем компоненты двух массивов будут соотноситься так:

 

a[0] a[1] a[2] a[3] a[4] a[5]
a3[1,1] a3[1,2] a3[1,3] a3[2,1] a3[2,2] a3[2,3]