русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Параметры-массивы и строки открытого типа


Дата добавления: 2014-11-27; просмотров: 1317; Нарушение авторских прав


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;



<== предыдущая лекция | следующая лекция ==>
Совместимость и преобразование типов данных | Процедурные типы


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 0.423 сек.