Возможность передачи подпрограмм в качестве параметра другим подпрограммам становиться особенно важной при программной реализации алгоритмов вычисления математике.
Чтобы использовать подпрограмму в качестве параметра, необходимо определить функциональный или процедурный тип (в зависимости от того, что передается в качестве параметра).
Функциональный (процедурный) тип представляет собой тип заголовка подпрограммы, в котором указывается имя типа, ключевое слово, определяющее процедуру или функцию, набор параметров и тип возвращаемого значения, если описывается функциональный тип.
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х сегментов выделяется сегмент стэка, в которых могут записываться параметры и локальные переменные. Адреса с этим сегментами связываются в процессе компиляции.