Процедуры и функции как параметры подпрограмм

Возможность передачи подпрограмм в качестве параметра другим подпрограммам становиться особенно важной при программной реализации алгоритмов вычисления математике.

Чтобы использовать подпрограмму в качестве параметра, необходимо определить функциональный или процедурный тип (в зависимости от того, что передается в качестве параметра).

Функциональный (процедурный) тип представляет собой тип заголовка подпрограммы, в котором указывается имя типа, ключевое слово, определяющее процедуру или функцию, набор параметров и тип возвращаемого значения, если описывается функциональный тип.

Type

Type_func=function (p:real; I:integer):char;

Type_prac = procedure (a:Boolean);

При таком описании имя подпрограмм не задаются, идентификаторы параметров задаются произвольно. Основной смысл заключается в порядке следования и типах параметра. Необходимо описать реальные подпрограммы, которые будут использоваться как параметры. Данные подпрограммы должны быть описаны как подпрограммы дальнего вызова поскольку при передачи их в качестве параметров необходим полный адрес их размещения: {$F+}; {$F-}; Far.

Пример использования функций в качестве параметров подпрограмм – подсчет определенного интеграла методом треугольника:

= h= const

, i=1,2,..,n

Основные переменные – параметры:функция Integral, параметры а – нижний, в – верхний пределы интегрирования, h – шаг интегрирования, Res – результат, ff – функция – параметр, определяющая подынтегральное выражение.

Type

Type_func= function (x_t: real): real;

Var

{$F+}

Function f (x_tmp:real): real;

Begin

F:=1/ (1 + sqr (x_tmp)); { }

End;

{$F-}

Procedure integral (a, b,h: real; var res:real; ff:type_func);

Var

X:real;

Begin

X:=a;

Res:=a;

While (x<=h) do

Begin

Res:=res +h*ff(x+h/2);

X:=x+h;

End;

End;

Begin

Integral (0, 1, 0,001,I,f);

Write (i:6:4);

End.

Организация памяти.

Лекция №7

Ссылочный и указательный типы данных. Организация памяти. Типы распределения памяти (статическая, динамическая). Ссылочный тип данных. Работа с адресами. Указатель. Основные операции с ссылочными переменными.

В режиме DOS процессор позволяет адресовать до 1 мегабайта памяти. Обращение к памяти ведется через регистры – указатели, в которых содержаться адреса ячеек памяти, к которым осуществляется обращение (SP- обращение к стеку, ВР – дополнительный указатель стека, IP- указатель команд, SI,DI - индексные регистры). Эти регистры имеют разрядность 16 бит, в связи с этим прямой доступ к памяти через эти регистры возможен только к 64 кб памяти. Эти 64 кб называют сегментом памяти. Таким образом память организована как последовательность таких сегментов. Для того, чтобы обратиться к какой-либо ячейки необходимо указать ее адрес, который при такой организации памяти представляет собой послать из двух cлов: адрес сегмента (16 бит) и адрес смещения(16 бит).

Фактически для адресации ячейки памяти вычисляется 20 битный физический адрес. Для вычисления этого адреса используется 2 регистра: 1.сегментный регистр (адрес сегмента) 2. Указательный регистр выделяются 4 сегментных регистра: 1) CS –сегментный регистр кода 2) DS – сегмент регистр данных 3) SS – сегментный регистр стЭка 4) ES – дополнительный (расширенный) сегментный регистр данных.

Физический 20 битный адрес вычисляется следующим образом: значение сегментного регистра сдвигается влево на одну 16тиричную цифру и к нему добавляется адреса смещения.

Исходя из этого существует множество способов адресации одной и той же ячейки памяти. Поле компиляции программы и компоновки, программа загружается в память. При этом код программы и данные распределяются по отдельным сегментам памяти, помимо этих 2х сегментов выделяется сегмент стэка, в которых могут записываться параметры и локальные переменные. Адреса с этим сегментами связываются в процессе компиляции.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: