і тим самим досягти потрібного результату.
Читач має право поставити запитання, чи варто було вводити обмеження і тут же давати кошти для їх обходу. Вся справа в тому, що будь-яке обмеження, з одного боку, вводиться для підвищення надійності програм, а з іншого - зменшує потужність мови, робить його менш придатним для якихось застосувань. У Турбо Паскалі нечисленні винятки щодо типів даних надають мові необхідну гнучкість, але їх використання вимагає від програміста додаткових зусиль і таким чином свідчить про цілком усвідомленому дії. br/>
Використання покажчиків
Підіб'ємо деякі підсумки. Отже, динамічна пам'ять становить 200 ... 300 Кбайт або більше, її початок зберігається у змінній HEAPORG, a кінець відповідає адресою змінної HEAPEND. Поточний адресу вільної ділянки динамічної пам'яті зберігається в покажчику HEAPPTR. p align="justify"> Подивимося, як можна використовувати динамічну пам'ять для розміщення великих масивів даних. Нехай, наприклад, потрібно забезпечити доступ до елементів прямокутної матриці 100х200 типу EXTENDED. Для размщеенія такого масиву вимагають пам'яті 200000 байт (100 * 200 * 10). Здавалося б, цю проблему можна вирішити наступним чином:
var, j: integer;: array [1 .. 100, 1 .. 200] of ^ real; i: = 1 to 100 doj: = 1 to 200 do (PtrArr [i, j ]);.
Тепер до будь-якого елементу новоствореного динамічного масиву можна звернутися за адресою, наприклад:
PtrArr [1,1] ^: = 0; PtrArr [i, j * 2] ^> 1 then
Згадаймо, однак, що довжина внутрішнього подання покажчика становить 4 байти, тому для розміщення масиву PTRARR потрібно 100 * 200 * 4 = 80000 байт, що перевищує розмір сегменту даних (65536 байт), доступний, як уже зазначалося, програмі для статичного розміщення даних. Виходом з положення могла б послужити адресна арифметика, тобто арифметика над покажчиками, тому що в цьому випадку можна було б відмовитися від створення масиву покажчиків PTRARR і обчислювати адресу будь-якого елементу прямокутної матриці безпосередньо перед зверненням до нього. Однак у Турбо Паскалі над покажчиками не визначені жодні операції, крім операцій присвоєння та відносини. p align="justify"> Проте, вирішити зазначене завдання все-таки можна. Як ми вже знаємо, будь покажчик складається з двох слів типу WORD, в яких зберігаються сегмент і зсув. У Турбо Паскалі визначені дві вбудовані функції типу WORD, що дозволяють одержати вміст цих слів: (X) - повертає сегментну частина адреси; (X) - повертає зсув. p align="justify"> Аргументом Х при зверненні до цих функцій може служити будь-яка змінна, в тому числі і та, на яку вказує покажчик. Наприклад, якщо маємо
var
р: ^ real; (p); ^: = 3.14;
то функція SEG (P) поверне сегмент...