Параметры-массивы и строки открытого типа
7.0-версия использует открытые параметры-переменные подпрограммы: массивы и строки. Открытые массивы - это параметры-массивы подпрограммы, размер которых не указывается в списке формальных параметров заголовка подпрограммы. Пример Объявление открытого одномерного массива function Sum(var a: array of byte): byte; var в объявлении параметра открытого типа обязательно. Фактическим параметром открытого массива может быть массив любого размера. Тип элементов фактического массива должен совпадать с типом массива-формального параметра. В качестве открытых массивов могут использоваться только одномерные массивы. Внутри подпрограмм границы переданного массива могут определяться с помощью функций Low и High. function Low(x:<тип>):word; Возвращает минимальное значение величины; x – параметр или идентификатор порядкового типа, типа-массива, типа-строки или открытого массива. function High (x:<тип>):word; Возвращает максимальное значение величины; x – параметр или идентификатор порядкового типа, типа-массива, типа-строки или открытого массива. Обращение к Low всегда будет давать 0, а результат функции High – верхнее возможное значение индекса при обращении к массиву относительно нуля, независимо от значений границ массива, передаваемого в подпрограмму. Напомним, как передавались в подпрограмму массивы. type arr=array[1...10] of byte; ….. procedure P(var a: arr); begin ….. end; Определён в программе тип arr и затем в заголовке подпрограммы объявлена переменная А указанного типа. После такого объявления процедуры Р в качестве в качестве фактического параметра при ее вызове мог фигурировать только массив, описанный при помощи того же самого(из-за именной эквивалентности типа) типа arr, т.е.
var A1, A2: Arr; ….. P(A1); ….. P(A2) Таким образом, процедура Р может работать только с массивами из десяти элементов типа byte, «пронумерованных» от 1 до 10. Это сильно ограничивает универсальность процедуры. Параметры-массивы открытого типа существенно расширяют возможности, т.к. в массиве – формальном параметре подпрограммы возможно не задавать его границы. Пример Программа подсчета суммы элементов разных массивов с использованием в процедуре формального параметра-открытого массива. Возможные пути решения задачи подсчета суммы элементов разных массивов: 1) написание отдельных суммирующих функций; 2) использование нетипизированных (бестиповых) параметров; 3) использование открытых массивов.
program OtkrPar; type ta1=array[1..5] of byte; ta2=array[0..2] of byte; ta3=array[-2..2] of byte; const a1:ta1=(1, 2, 3, 4, 5); a2:ta2=(7, 8, 9); a3:ta3=(1, 2, 3, 4, 5); procedure p(var a: array of byte); var i,s:word; begin s:=0; for i:=low(a) to high(a) do begin s:=s+a[i]; write(‘ ‘, i,’ ‘,a[i]); end; writeln(‘s= ‘,s); end; begin p(a1); p(a2); p(a3); end. Результат выполнения программы program OtkrPar. Вывод на экран: 0 1 1 2 2 3 3 4 4 5 s=15 0 7 2 8 3 9 s=24 0 1 1 2 2 3 3 4 4 5 s=15 Программа иллюстрирует интерпретацию граничных значений и индексов открытых массивов. Остановимся на механизме открытых строк. Во многом они аналогичны открытым массивам и позволяют передавать в подпрограммы строки произвольной длины. Директива {$V+/-}-проверка строковых параметров. Если использовать ключ{$V+}, то при обращении к подпрограммам и передаче ей параметров типа string фактические и формальные параметры должны быть идентичными. Если использовать ключ{$V-}, то формальные и фактические параметры могут быть строками разного типа, в том числе разной длины. Ключ являются локальным. По умолчанию используется ключ {$V+}. Эквивалентное меню Options/Compiler/Strict var-strings. В 7.0 версии есть директива {$P+/-} –использование в качестве параметров массивов открытого типа. Она ориентирована специально на поддержку открытых строк. По умолчанию используется ключ{$P-}. Эквивалентное меню Options/Compiler/Open parameters.
Если в программе установили {$P-}, то var-параметры подпрограммы, имеющие тип string, считаются обычными параметрами, передаваемыми по ссылке; для них действительны обычные правила эквивалентности типов. Если в программе задана директива {$P+}, то var-параметры подпрограмм, имеющие тип string, считаются открытыми параметрами. Это означает, что независимо от установки директивы {$V+/-} в качестве фактического параметра подпрограмме можно передать переменную любого строкового типа. При этом внутри подпрограммы размер (максимальная длина) строки – формального параметра всегда будет совпадать с размером фактического параметра. Пример {$P+} program TestOpen; uses crt; var s1:string; s2:string[10]; procedure p(var s: string); begin writeln(‘s= ‘,sizeof(s),’ ‘,’l=’, length(s)) end; begin s1:=’abs’; p(s1); s2:=’xxxxxxxxxx’; p(s2); end. function size of(x):word; Возвращает размер аргумента в байтах; х-переменная любого типаили любой тип. function length (s:string):integer; Возвращает текущий размер строки; S-строка, у которой определяется размер.
Результат выполнения программы program TestOpen. Вывод на экран: S=256 L=3 S=11 L=10 Внутри процедуры Р размер открытой строки всегда будет соответствовать реально переданной в ней фактической строки. Установим {$V-}. Тогда S=256 L=3 S=256 L=10 В этом случае внутри процедуры Р строка-параметр всегда трактуется по «максимуму», независимо от того, какой фактический параметр реально ей передан. По существу, директива {$V-} просто снимает контроль за соответствием типов и за корректностью присваивания строковым var-параметрам, что может привести к тяжелым ошибкам во время исполнения. Механизм открытых строк, предоставляет большую гибкость при передаче параметров, сохраняет полный контроль за их использованием. Дополнение Версия 7.0 содержит специальный стандартный строковый тип с именем openstring, который указывать вместо любого строкового типа при спецификации параметров подпрограмм. Использование типа openstring включает механизм открытых строк для данного параметра независимо от текущей установки директивы {$P+/-}. Пример procedure p(var s: openstring); begin writeln(‘s=’, sizeof(s),’L=’,length(s)); end; Процедурные типы
Turbo Pascal позволяет вводить переменные специального вида, значениями которых могут служить подпрограммы. Иными словами, Turbo Pascal позволяет интерпретировать процедуры и функции как значения, которые можно присваивать переменным и использовать в качестве параметров. Речь идёт о подпрограммах как о целостных объектах, а не о значениях, возникающих в результате их выполнения. Пример var P: procedure; Возможными значениями переменной P могут являться любые процедуры без параметров. В общем случае процедурный тип задаётся конструкцией, очень похожей на заголовок процедуры или функции. Пример type Func=function(x,y: integer): integer; var F1, F2: Func; Переменным F1 и F2 могут быть присвоены в качестве значений функции от двух целых параметров, возвращающие целый результат. Если в этой программе есть описание функции function Add(a,b: integer):integer; begin Add:=a+b end; то допустимо присвоение вида F1:=Add; Переменной F1 в качестве значения присваивается функция как таковая. Выполнения этой функции не происходит. После такого присваивания имеется возможность вызывать функцию Add как по значению, так и с помощью указания переменной F1, то есть writeln(Add(1, 2)); writeln(F1(1, 2)); Оба оператора напечатают число 3. Определение процедурного типа аналогично заголовку подпрограммы с той лишь разницей, что имя подпрограммы не задаётся. Пример type Proc= procedure; BinOperation= function(x,y: real): real; UnOperation= function(x: real): real; Reading= procedure(var f: text; var Elem: char); Имена формальных параметров, указываемых в процедурных типах, играют чисто иллюстративную роль, на смысл определений никакого влияния не оказывают. Необходимыми являются только идентификаторы типов параметров и результатов. Последнее указывается для функций. Turbo Pascal позволяет определять переменные, значениями которых могут быть процедуры и функции. Для таких переменных допускаются операторы присваивания, в правых частях которых находятся идентификаторы других процедурных переменных или идентификаторов подпрограммы. Переменная процедурного типа в различные моменты времени может иметь в качестве значения различные подпрограммы.
Такие переменные могут быть использованы для вызова подпрограмм, которые присвоены этим переменным. Пример Пусть в программе есть var operation: function(x,y: real): real; function Add(a,b: real):real; begin Add:=a+b end; function Sub(a,b: real): real; begin Sub:=a-b end; и выполняется if condition then operation:=Add else operation:=Sub; writeln(operation(2.05,3+x)); В зависимости от истинности условия condition переменной operation будут присвоены либо функция Add, либо Sub. Активизируется та функция, которая была присвоена переменной operation. Таким образом, в вызовах функции и в операторах процедуры, кроме идентификаторов соответствующих подпрограмм могут быть имена переменных процедурных типов. Выполнение таких конструкций заключается в вызове подпрограмм, которые были присвоены этим переменным.
Читайте также: III. Форми та строки подання звіту Воспользуйтесь поиском по сайту: ©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|