- •Мета лабораторної роботи - вивчити блочну організацію програм Паскаль та Сі та стратегії розподілу пам'яті. Теоретичні відомості
- •Правила написання програм
- •Своєчасно звільняйте пам'ять, “захоплену” в “купі” (оператори dispose/ delete) Завдання
- •Контроль знань та вмінь
- •Контрольні запитання
- •Лабораторна робота 7
- •Дослідження структурних операторів операторного
- •Базису мов програмування паскаль та сі
- •Мета лабораторної роботи - вивчити устрій структурних операторів мов Паскаль та Сі та дослідити можливості та особливості застосування різноманітних форм структурних операторів.
- •Теоретичні відомості
- •Правила написання програм
- •Завдання
- •Методичні вказівки
- •Контроль знань та вмінь
- •Контрольні запитання
Лабораторна робота 6
ДОСЛІДЖЕННЯ БЛОЧНОЇ ОРГАНІЗАЦІЇ ПРОГРАМ,
СТРАТЕГІЙ РОЗПОДІЛУ ПАМ'ЯТІ
Мета лабораторної роботи - вивчити блочну організацію програм Паскаль та Сі та стратегії розподілу пам'яті. Теоретичні відомості
Програми на мовах Паскаль та Сі мають блочну організацію, що дозволяє керувати областю дії та періодом існування програмних об’єктів для ефективного використання памяті під час виконання програм.
Область дії та період існування програмного об’єкту залежить від використання відповідної стратегії розподілу виділеної під значення об’єкту пам'яті. Існують статичний та динамічний розподіл пам'яті, останній поділяється на розподіл у блоці та «купі».
Для програм з блочною структурою характерними рисами є мембраний ефект, регулюючий область дії програмних об’єктів, та засоби його подолання.
Статичний розподіл пам’яті
Статичні програмні об’єкти існують весь час життя програми та доступні в тій частині програми, в якій вони описані. Статичними програмними об’єктами у мові Pascal є всі об’єкти, які об’являються у секції Var головної програми (зовнішній блок) або як типізовані константи. У мові С статичні об’єкти об’являються з позначенням „static”.
Паскаль:
<опис змінної> ::= {див. лаб. 3}
<типізована константа>::= const<позначка імені>:<індикатор типу>=<R - вираз>;
<позначка імені>::= <ідентифікатор>
<R - вираз>::={див. лекції}
Наприклад:
const r : real = 5;
Сі:
модифікатор static
<опис змінної>::=static<індикатор типу>{*}02<ідентифікатор>;
Наприклад:
static float r1;
static float r2 = 5;
Динамічний розподіл пам’яті у блоці
Об’єкт, об’явлений у блоці (між { } ) існує від точки об’яви до кінця блоку. Об’єкт видаляеться з пам’яті перед виходом з блоку, при цьому значення обєкту втрачається. Змінні в мові Сі створюються та використовуються згідно з динамічною стратегію у блоці за замовчуванням або за допомогою позначення „auto” при описі.
Сі:
модифікатор auto
<опис змінної>::={auto}01<індикатор типу>{*}02<ідентифікатор>;
<блок>::={{<опис змінної>}1n{<оператор}0m}
Наприклад:
{
auto float r1;
float r2 = 5;
r1 = r1 + r2;
}
Об’єкт, який об’явлено у певному блоці, є доступнм у будь-якому вкладеному блоці. Але якщо у вкладеному блоці об’являється об’єкт з однаковим позначенням, то даний внутрішній об’єкт „покриває” зовнішній на період існування вкладеного блоку. Це явище іменується „мембранним ефектом:
void main (void)
{
int a=1, b=2;
{
int a=10; // a = 10, b = 2
static int c=3; // об’ява статичної змінної
}
// знову a = 1, b = 2. Змінна "a" з вкладеного блока видалена
// Змінна „c" існує та має значення "3", але є недоступною */
}
Динамічний розподіл пам’яті в “купі”
Динамічні об’кти у „купі” не мають власних імен та створюються та знищуються за допомогою спеціальних операцій. Доступ до цих об’ктів може бути здійснений тільки за допомогою покажчиків.
Паскаль:
<захоплення пам’яті>::=new(<позначка імені вказівної змінної>);
<звільнення пам’яті>::=dispose(<позначка імені вказівної змінної>);
Наприклад:
var
pI : ^integer;
begin
new pI;
pI^ := 25;
dispose pI;
end
Сі:
<захоплення пам’яті>::=<позначка імені вказівної змінної>=new<індикатор типу>;
<звільнення пам’яті>::=delete<позначка імені вказівної змінної>;
Наприклад:
main()
{
int *pI;
pI = new int;
*pI := 25;
delete pI;
}
Глобальний дозвіл видимості імен
Сі:
операція ::
<глобальний дозвіл>::=::<позначка імені глобальної змінної>
Наприклад:
int i = 45;
main()
{
float i = 10.1; // i = 10.1 ::i = 45
::i = ::i * 2; // i = 10.1 ::i = 90
i = i+ ::i; // i = 100.1 ::i = 90
}