чисел у масив;
2) відшукання серединного елемента;
3) знищення динамічного об'єкта – масиву цілих чисел;
4) перепис елементів з файлу дійсних чисел у масив;
5) виведення.
Для виконання алгоритму опишемо в програмі дві змінні вказівного типу: значення першої вказуватиме на масив цілих чисел, другої – на масив дійсних чисел, створених у процесі виконання програми за допомогою процедури new. Проміжний масив цілих чисел стає непотрібним після того, як визначене значення серединного елемента цього масиву. Знищуємо його за допомогою процедури Dispose. Файли опрацьовують (читають) за допомогою відповідних процедур. Програма, що реалізує наведений алгоритм, має вигляд.
program druk(lfile, Rfile, output);
const N=10000;
type
imas=array [1..N] of integer;
rmas=array [1..N] of real;
var i,j,k: integer;
p: ^mas;
q: ^mas;
lfile: file of 1..100;
Rfile: file of real;
begin new(p);
Assign(lfile, 'Cfile');
Assign(Rfile, 'Dfile');
{Перепис елементів з Ifile у масив}
reset(inie); i:=0;
while not eof(lfile) do
begin
i:=i+1;
read(lflle,p^i]);
end;
{Відшукання серединного елемента}
i:=p^idr^+l];
{Знищення динамічного об'єкта imas}
Dispose(p);
new(q);
{Перепис елементів з Rfile у масив}
reset(Rfile);
j:=0;
while not eof(Rfile) do
begin
J:=J+1;
read (Rfile, q[j])
end;
{Виведення}
for k:=j downto і do
write(q^[k], '');
writeln
end.
1.6. Особливості роботи з динамічними змінними
Під час роботи з динамічними об'єктами треба дотримуватись такого правила: вивільняти області пам'яті, виділені під динамічні змінні, якщо їх згодом не використовують. Інакше використання динамічних змінних призводить до швидкого "засмічення" динамічної пам'яті та її переповнення.
Ще одна особливість пов'язана зі стековим принципом розміщення статичних змінних, якими можуть бути вказівні змінні. Розглянемо такий приклад:
program Noreference;
type anketa=record
........
end;
aan^anketa;
procedure GetAnketa;
var an:aan;
begin
an:=New(aan);
end;
begin
writeln(MemAvail);
GetAnketa;
writeln(MemAvail);
end.
Тут після виходу з процедури GetAnketa втрачено доступ до змінної ап вказівного типу, а отже, і до динамічного об'єкта, на який вона вказує. Водночас об'єкт типу anketa залишається в динамічній пам'яті, його місце не вивільняється, що підтверджує результат виведення розміру вільної динамічної пам'яті перед і після виконання процедури. В описаному прикладі маємо втрату вказівки на динамічний об'єкт. Щоб уникнути таких випадків, треба під час виходу з блоку (процедури), в якому описані локальні змінні, що є вказівниками на відповідні динамічні об'єкти, або знищувати ці об'єкти, якщо вони надалі непотрібні, за допомогою процедури Dispose, або зберегти вказівники на них, присвоївши їх, наприклад, глобальним змінним.
Може виникнути протилежна ситуація, коли деяка область пам'яті вивільнена, а в програмі залишилася вказівка на неї. Розглянемо такий приклад:
var
q: ^ real;
procedure p1;
var r: real;
begin
r:=10.5;
q:=@r; writeln(q^);
end;
procedure p2;
var s: real;
begin s:=20.5;
writeln(q^)
end;
begin
P1;
P2
end.
У цьому прикладі використана унарна (що виконується з одним операндом) операція @ – обчислення адреси змінної r (взяття вказівника), що визначена в Турбо Паскалі. Присвоєння цієї адреси вказівній змінній q надає їй значення вказівника на змінну r. Під час виконання програми будуть послідовно виведені значення 10.5 і 20.5, хоча виводиться одна й та ж область пам'яті – та, на яку вказує вказівник q. Причина полягає в тому, що у разі виходу з процедури P1 локальна змінна r перестає існувати, а вказівник на цю область залишається, оскільки q – глобальна змінна. В процедурі P2 вводиться змінна s, яка згідно зі стековим принципом розподілу пам'яті розміщується на місці r.
1.7. Визначення розмірів динамічної пам'яті
Використання динамічних змінних значно розширює можливості написання великих програм, оскільки ємність пам'яті для статичних змінних дуже обмежена. Для динамічної ж пам'яті відведена практично вся ємність оперативної пам'яті, крім пам'яті для коду програми і статичних змінних.
Однак часто така ємність динамічної пам'яті надлишкова, часом і недопустима, оскільки програма не може викликати іншу програму, розміщену в ЕХЕ-файлі. Інші програми можуть взагалі не використовувати динамічної пам'яті.
У Турбо Паскалі для задания розмірів динамічної пам'яті використовують директиву компілятора $М, що розміщена на початку програми і має три параметри. Перший параметр визначає максимальну ємність пам'яті під стек локальних змінних, два інші задають мінімальну і максимальну ємності динамічної пам'яті. Наприклад:
{$М 16384,1024,65000}
Мінімальна ємність – це той мінімум, нижче якого програма не може виконатися. Якщо вона дорівнює нулю, то програма буде виконуватись завжди. Третій параметр визначає максимальну ємність пам'яті, яку можна використати під динамічні змінні. Іншими словами, ємність динамічної пам'яті задають з огляду на реальну наявність пам'яті з початку роботи програми, однак вона не повинна перевищувати максимальної ємності.
За замовчуванням діють такі параметри директиви:
{$М 16384,0,655360}
тобто під стек виділено 16К, під динамічну пам'ять – усю вільну оперативну пам'ять, доступну операційній системі.
1.8. Перетворення типів
У мові Паскаль типи даних задають статично, і загалом не допустимо їх змінювати в процесі виконання програми. Однак Турбо Паскаль допускає в певних межах такі перетворення, які треба задавати в явному вигляді.
Є три способи задавати перетворення типів: неявні перетворення, використання стандартних функцій і явні перетворення. Перші два визначені в авторській версії мови Паскаль, а третій – у Турбо Паскалі.
Спосіб неявного перетворення допустимий тільки в операції присвоєння, коли, наприклад, дійсній змінній присвоюється ціле. В другому способі для пере-творення типів використовують такі функції: odd, trunc, round, ord, chr.
Явне перетворення типів у Турбо Паскалі використовує спеціальну конструкцію, Загальний вигляд перетворення типу такий:
<тип>(<змінна>)
Тобто для надання змінній іншого типу потрібно взяти її в дужки, зазначити перед дужками ім'я нового типу. Розглянемо цей спосіб перетворення типу змінної на прикладі. Нехай деяка змінна описана, як
var і: byte;
Присвоєння їй значення
i:='I'
призведе до помилки – невідповідності типів. Таке присвоєння можна виконати тільки за допомогою конструкції явного перетворення типів:
char(i):='I'
Цю конструкцію можна використовувати в усіх позиціях, де є змінна. Треба враховувати, що розмір змінної (тобто кількість байтів для її розміщення) повинен збігатися з розміром типу, ім'я якого зазначене перед дужками.
Аналогічно до перетворення типу змінної можна використовувати перетворення типу виразу. Вираз, записаний у