Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
МетодАлгКП.doc
Скачиваний:
109
Добавлен:
18.02.2016
Размер:
2.27 Mб
Скачать

0 Жазылады.

Көрсеткiштердi басқа көрсеткiштермен салыстыруға (=, <>), оларға адрес беруге немесе басқа көрсеткiштiң мәнiн меншiктеуге, параметр ретiнде беруге болады. Көрсеткiштi баспадан шығаруға және экранда бейнелеуге болмайды.

Бөлiнген динамикалық жадыға қол жеткiзу төмендегiдей кодталады:

<көрсеткiш идентификаторы >^

Динамикалық жадыда орналасқан айнымалыларға қол жеткiзу мысалын қарастырайық:

TYPE SYM=^CHAR; ZAP=RECORD

FIELD1, FIELD2: REAL; END;

M=ARRAY[0..9] OF WORD; VAR

CH: SYM; REC: ^ZAP; MAS: ^M;

...

CH^:='*'; {CHAR типтi динамикалық айнымалыға қол жеткiзiп,

ол ауданға жұлдызша символын жазу}

...

READLN (REC^.FIELD1); {динамикалық жазбаның FIELD1

өрiсiне қол жеткiзу, оған пернетақтадан мзндер енгiзу}

...

WRITELN (MAS[5]^); {динамикалық жиымның MAS[5]

элементiне қол жеткiзу, көрсетiлген элемент мәнiн экранға шығару}

...

CH^, REC^.FIELD1 жзне MAS[5]^ адрестерi программада соларға сәйкес СH, REC жзне MAS көрсеткiштерiнде жазылған динамикалық объектiлер рөлiн атқарады деуге болады.

POINTER типтi айнымалыларға қол жеткiзу (көрсеткiшi ешқандай нақты типтi көрсетпейтiн және кез келген типтегi көрсеткiштермен үйлесiмдi) қатеге алып келетiндiгiн айта кету керек.

Мысалы. VAR P:POINTER;

...

P^:=1; {қате!}

15.3 Динамикалық жадымен жұмыс істеуге арналған процедуралар мен функциялар

Динамикалық жадыға орналастыруға жəне босатуға арналған стандартты процедуралар

Программа орындалу барысында, динамикалық жадыны қолданатын кездер болады, мысалы: жадыны керектi түрде бөлу, ол жерге қандай да бiр мәндердi орналастыру, олармен жұмыс iстеу және ол мәндер керек болмаған жағдайда жадыны босату, т.с.с.

Динамикалық жадыны екi тәсiлмен бөлуге болады:

1. NEW процедурасының көмегiмен:

New (P);

мұндағы Р - «типтелген көрсеткiш» типтi айнымалы.

Бұл процедура жаңа динамикалық айнымалы жасайды (ол үшiн жадыдан орын бөледi) жзне оған P көрсеткiшiн орналастырады (P-да жадының бөлiнген ауданының адресi жазылады). Бөлiнетiн ауданнық мөлшерi мен құрылымы, P көрсеткiшi байланысқан типтегi мәндерге берiлетiн жады көлемiне байланысты. Жасалған айнымалы мзнiне P^ көмегiмен қол жеткiзуге болады.

2. GETMEM процедурасының көмегiмен:

GetMem (P,size);

мұндағы P – қажет типтегi “көрсеткiш” типтi айнымалы.

size – сұралған жады мөлшерiн байтпен көрсететiн бүтiн санды өрнек.

Бұл процедура қажет қасиеттерi жзне мөлшерi бар жаңа динамикалық айнымалы жасайды. Айнымалының адресiн “көрсеткiш” типтi Р айнымалысына орналастырады. Жаңа жасалған айнымалы мәнiне қол жеткiзу P^ көмегiмен iске асырылады.

Мысалы: TYPE REC=RECORD

FIELD1:STRING[30];

FIELD2:INTEGER; END;

PTR_REC= ^REC; VAR

P:PTR_REC; BEGIN

GETMEM(Р, SIZEOF (REC)); {жады бөлу, бөлiнген аудан

адресi Р-да жазылады; бұл жадының байтпен берiлген мөлшерiн сипатталған типтегi мәндерге қолданылатын, стандартты SizeOf функциясы анықтап, қайтарады; алайда, қолданылатын өрiстердiң iшкi берiлу мөлшерiн бiле отырып, жады мөлшерiн қолмен есептеп, SizeOf (Rec) орнына тұрақты ретiнде жазуға болады}

...

{жадыны пайдалану}

...

FREEMEM(P, SIZEOF(REC)); {қажет емес жадыны босату}

...

Динамикалық жадыны төрт тәсiлмен босатуға болады.

1. Автоматты түрде, барлық программа аяқталғаннан кейiн.

2. Стандартты DISPOSE процедурасының көмегiмен.

Dispose (P);

мұндағы P – “көрсеткiш” типтi айнымалы (типтелген).

DISPOSE(P) процедурасының жұмысының нәтижесiнде, P көрсеткiшiмен байланысқан жады ауданы, алдағы уақытта қолдануға болатын бос аудан ретiнде белгiленедi. Бiрақ P көрсеткiшi және онымен байланысқан жады физикалық түрде тазаланбайды, жазба экземплярын өшiрiп тастап та оның өрiстерiнiң мәнiн алуға болады, алайда бұл жағдайды қолдануға кеңес берiлмейдi.

DISPOSE процедурасыныц қолдану тəсiлдерi əр түрлi болғандықтан, бұл процедураны MARK жəне RELEASE процедураларымен бiрге қолдануға болмайды.

2. FRЕЕМЕM процедурасының көмегiмен.

FreeMem (P, size);

мұндағы P - “көрсеткiш” типтi айнымалы,

size – босатылатын жады мөлшерiн байтпен көрсететiн бүтiн санды өрнек.

Бұл процедура жадыны, P көрсеткiшiмен байланысқан, SIZE өрнегiнiң мәнiнен тең мөлшермен, бос жады ретiнде белгiлейдi (GETMEM мысалын қараңыз).

4. Стандартты МАRK жзне RELEASE процедуралары көмегiмен.

Mark (P); Release (P);

мұндағы P - “көрсеткiш” типтi айнымалы;

MARK - Р көрсеткiш-айнымалысында динамикалық ауданның қалып-күйiн есте сақтайды;

RELEASE – MARK процедурасы Р көрсеткiшiнiң ағымдағы мәнiн есте сақтағаннан кейiн NEW немесе GETMEM процедуралары бөлген, барлық динамикалық жадыны босатады.

Қолдану тәсiлдерi әр түрлi болғандықтан, MARK және RE- LEASE процедураларына қол жеткiзудi DISPOSE жзне FRЕЕМЕM процедураларына қол жеткiзумен кезектестiруге болмайды.

Мысалы: VAR P:POINTER;

P1,P2,P3:^INTEGER;

BEGIN NEW(P1); P1^:=10;

MARK(P); {динамикалық ауданды белгілеу} NEW(P2);

P2^:=25; NEW(P3); P3^:=P2^+P1^; WRITELN (P3^);

RELEASE(P); {P2^ жəне P3^ байланысқан жады босатылды, ал P1^ қолданылуы мүмкін}

END.

Динамикалық жадыны өңдеуге арналған стандартты функциялар

Программа орындалу барысында динамикалық жады қалып- күйiн бақылау қажет болуы мүмкiн. Мұндай бақылау мақсаты – келесi бөлiнетiн, қажет мөлшердегi динамикалық ауданның мүмкiндiктерiн бағалау. Мұндай мақсаттар үшiн Турбо Паскаль екi функция бар (параметрсiз).

MaxAvail;

Бұл функция динамикалық ауданның дәл осы мезетте бос ең үлкен бөлiгiнiң байтпен берiлген мөлшерiн қайтарады. Осы мөлшер бойынша динамикалық жадының бөлiнетiн ең үлкен мөлшерi жайлы айтуға болады.

Қайтарылатын тип мзнi - longint.

TYPE ZAP=RECORD

FIELD1: STRING [20]; FIELD2: REAL;

END; VAR P: POINTER; BEGIN

...

IF MAXAVAIL <SIZEOF(ZAP) THEN

WRITELN (‘HE ХВАТАЕТ ПАМЯТИ!') ELSE

GETMEM(Р, SIZEOF(ZAP));

...

Екiншi функция:

MemAvail;

Бұл функция динамикалық жадының бос байттарының жалпы санын қайтарады, демек, барлық бос бөлiктердiң мөлшерi және бос динамикалық аудан мөлшерi қосылады. Қайтарылатын тип мзнi - longint.

...

WRITELN( 'бос’, MEMAVAIL, ‘ байт' );

WRITELN(‘ең үлкен бос бөлiк=’, MAXAVAIL, ‘байт' );

...

Бұл шешiм келесi жағдайға негiзделген. Динамикалық аудан, “түйдек” (HEAP) деген аты бар арнайы бөлiнген ауданда орналасады. Түйдек, программа iске қосылғаннан кейiнгi бос жадыны толығымен немесе оның бiр бөлiгiн алады. Түйдек мөлшерi компилятордың $М директивасы арқылы беруге болады:

{$М <стек>, <түйдектiң ең кiшiсi>, <түйдектiң ең үлкенi>}

мұндағы <стек> - стек сегментiнiң байтпен берiлген мөлшерiн көрсетедi. Үнсiз келiсiм бойынша стек мөлшерi 16 384 байт, ал стектiң ең үлкен мөлшерi 65 538 байт;

<түйдектiң ең кiшiсi> - түйдектiң байтпен берiлген ең кiшi мөлшерiн көрсетедi; үнсiз келiсiм бойынша ең кiшi мөлшер 0 байт;

<түйдектiң ең үлкенi> - түйдектiң байтпен берiлген ең кiшi мөлшерiн көрсетедi; үнсiз келiсiм бойынша ең үлкен мөлшер 655

360 байт, көп жағдайда түйдекке барлық бос жадыны бередi; бұл мән түйдектiң ең кiшi мөлшерiнен кем болмауы керек.

Барлық мәндер ондық немесе он алтылық формада берiледi. Мысалы, келесi екi директива эквивалентi:

{$М 16384,0,655360}

{$M $4000, $0, $A000}

Егер жадының көрсетiлген ең кiшi көлемi бос болмаса, онда программа орындалмайды.

Динамикалық жадыға орналастыру System модулiнiң басқару программаларының бiрi болып табылатын топ администраторы арқылы iске асырылады.

Бақылау сұрақтары

  1. Сiлтемелiк типтер мен айнымалылар қалай хабарланады?

  2. Жадыны динамикалық айнымалыларға бөлу қандай процедуралар көмегiмен iске асырылады?

  3. Сiлтемелiк айнмалы қандай мəндер қабылдай алады?

  4. пew жəне dispose процедураларыныц қызметi қандай?

  5. Көрсеткiштi алу операциясы қалай орындалады?

  6. Көрсеткiштермен қандай операциялар орындауға болады?

  7. Статикалық айнымалыныц динамикалық айнымалыдан айырмашылығы неде?

Тапсырмалар

1. Пернетақтадан енгiзiлген төрт санның ең үлкенiн таңдап алу программасын құрастырыңыз.

2. 15 бүтiн элементтен тұратын жиым мəндерi бойынша графика бейнесiн алатын программа құрыцыз.

3. Келесi өрiстерден тұратын жазба жазылған файл құрастырыңыз:

1) нөмiрi, 2) тегi, 3) телефоны. Пернетақтадан енгiзiлген тегiне сəйкес телефон нөмiрiн экранға шығарыцыз.

4. Көлемi 4x5 жиымды толтыратын жəне бағанасы бойынша сұрыптайтын программа құрыңыз. Бастапқы жəне өңделген жиымды экранға шығарыңыз.

5. Көлемi 4x5 жиымның барлық терiс элементтерiн олардың абсолют шамасымен алмастыратын программа құрыңыз. Бастапқы жəне өңделген жиымды экранға шығарыңыз.

6. N бутiн саннан тұратын файл құрастырыңыз. Файлдың ең үлкен, ең кiшi компонентiн жəне олардыц позицияларның нөмiрiн экранға шығарыңыз.

7. Пернетақтадан енгiзiлген кезейсоқ текке де, атқа да кiретiн символдар жиынын экранға шығарыңыз.

Ұсынылатын әдебиеттер: 1, 8, 9