UF

 Мәліметтердің динамикалық құрылымы. Сілтемелер. Кезектер және ағымдармен жұмыс істеу.

    жоспары:

1. Динамикалық жад

2. Сілтемелер

                       

Негізгі ұғымдардың сөздігі: сегмент, жад, үйінді, стек, сілтемелер.

Студенттерде қалыптасу керек білім мен дағды: динамикалық  жад түсінігін, сілтемелер түрлерін, динамикалық айнымалыны құру процедураларын меңгеру.                     

 

12.1. Динамикалық жад

 

Физикалық принциптерге сүйене отырып, әдетте жад 0-ден бастап нөмірленетін байттар тізбегі түрінде қарастырылады. Әр нөмір сол байттың адресі. Өлшемдері 65536 (64кбайт) байттан аспайтын жад бөліктері сегменттер делінеді. Олар 16-ға бөлінетін адрестерден басталады. Сонымен жад көптеген сегменттерден тұрады. Сегменттерді бөлу және оларға айнымалыларды, констант түрлерін, программаның кодын орналастыруды жүйе автоматты түрде, өзі орындайды.Транслятор орналастыратын айнымалылар статикалық, ал программаның орындалу барысында орын бөлуді қажет ететін айнымалылар динамикалық делінеді. Статикалық айнымалылар Турбо Паскальда программаның VAR бөлімінде сипатталынады да, оларға жадтың берілгендер сегментінен орын бөлінеді. Ал блоктардағы (процедуралар мен функциялар) сипатталынған жергілікті (локальді) айнымалыларға бөлек стек сегментінен орын бөлінеді. Әдетте стек өлшемі 16384 байт. Оны 64 кбайтқа {$M} директивасымен ұлғайтуға болады. Стандартты процедуралар мен функциялардың да берілгендері стек сегментіне орналасады. Программадағы айнымалыларға берілгендер сегментінен, стек сегментінен орын жетпегенде динамикалық бөлінетін жадты пайдалану қажет болады. Динамикалық бөлінетін жад – жүйелік программалар орналаспайтын, қалған бос жад. Оны үйінді (кучка) деп те атайды. Динамикалық жадтың өлшемі әдетте 0, ал ең үлкен өлшемі – 655360. Программамен жұмыс істеу кезінде әдетте айнымалылар мен тұрақтылардың жадтың қай орнына жазылатыны ескерілмейді де, олардың атаулары бойынша жұмыс істей беріледі. Бұл әдіс үлкен орынды талап ететін берілгендерді өңдегенде қиындықтар тудырады. Мысалы, массивтермен жұмыс істеу үшін оларды алдын ала сипаттап (жадтан орындар бөліп) қою керек. Кіші көлемді массивпен жұмыс істеу кезінде үлкен орын бөлу жадты үнемі пайдалану тәсіліне жатпайды. Кейде 64 Кбайттан артық орын алатын үлкен көлемді берілгендермен жұмыс істеуге тура келеді. Турбо Паскальда бір типті берілгендер үшін 64 Кбайттан артық орын (сегмент) бөлінеді де, орын жетіспегені жөнінде хабар беріп, компьютер тоқтап қалады. Мұндай жағдайда, немесе жалпы жадты тиімді пайдалану әдісі – сілтемені және динамикалық бөлінетін жадты (ДБЖ) пайдалану.

ДБЖ – ның өлшемінің 0-ге дейін азаюын және ең үлкен шегіне жетуін келесі директива арқылы өрнектеуге болады:

{$M<стек өлшемі>,<үйінді минимумы>,<үйінді максимумы>}, үйіндіден орын алатын айнымалылар динамикалық айнымалы делінеді.

12.2. Сілтемелер

Мәні адрес болып келген айнымалылар нұсқағыштар (көрсеткіштер) делінеді.  Нұсқағыштар – типсіз, типтік болып екіге бөлінеді. Типсіз сілтемелердің сипатталынуы:

Var < сілтемелер  тізімі>: Pointer; Мысалы, Р: Pointer;

Типтік сілтемелердің сипатталуы:

Var < нұсқағыштар  тізімі>: ^ <базалық тип аты>.

Типтік сілтеме - динамикалық айнымалы деп аталатын, кез келген басқа базалық тип айнымалысына сілтеу.

Мысалы:

Var

PINT: ^ Integer; { PINT  - бүтінге сілтеме}

P_ String: ^ String; { P_ String - жолдық қатарға сілтеме}

T: ^ Array [1..5] of real; {қатарға сілтеме}

Адресі сілтемеде көрсетілген деректерді, сілтеме атынан кейін ^ таңбасын жазу арқылы алуға болады.

Pint ^:=2 { Pint – те көрсетілген адреске 2-ні меншіктеу}

P_ String^: = ‘университет’;

Меншіктеу операторының орнына әдеттегідей енгізу операторын пайдалану да мүмкін: read (p^).

Динамикалық жадтан айнымалы үшін орын бөлінуі динамикалық айнымалының құрылуы деп түсінеміз. Динамикалық айнымалылар құрылмай тұрғанда сілтемелер мәні анықталмайды. Оған дейін сілтемеге арнайы мән беруге болады. Pint: = Nil;

Динамикалық айнымалыны құру үшін NEW процедурасы қолданылады. Мысалы, NEW (Т); яғни динамикалық айнымалы құрылады. Әзірше оның компоненттері анықталмаған. Динамикалық айнымалының өз аты жоқ, олар сілтеме атауы және ^ – таңбасы арқылы белгіленеді.

Мысалы, Т – массивінің 3-ші элементі – Т ^[3]

Сонымен NEW (< типтік сілтеме >) динамикалық айнымалы құрады да, ал DISPOSE (< типтік нұсқағыш>) жадты үйіндіге босатып қайтарады.

Мысалы,

VAR PS: ^ String;

Begin

New (PS) ;            {256 байт жад бөлінеді}

PS ^ : = ‘Динамикалық жад’;

Writeln (PS^);

         Dispose (PS); {PS^ - жад бөлігі босады}

End.

NEW – процедурасы арқылы ДБЖ-дан бөлінетін орын қажетті мөлшерден үлкен болуы мүмкін. GetMem процедурасы жадтан қажетті орын бөліп, оның адресін сілтемеге салады.

         GetMem (<сілтеме >, < байд өлшемімен жад бөлігі>);

GetMem (Р, 1000); {1000 байт жад аймағы бөлініп, оның адресі Р-ға жазылады}.

NEW және GetMem процедураларымен бөлінген жад өлшемі 8-ге бөлінетіндей болып толықтырылады және ДБЖ сегменттерінің бастапқы адрестері 8-ге бөлінеді.

Егер үйіндіде қажетті жад мөлшері болмаса, экранға мынадай хабарлама шығады:

Runtime Error 203 …

Мұндай үйінді толып қалатын жағдай болмау үшін, динамикалық жадты пайдалану қажеттігі болмаған кезде оны босатып, үйіндіге қайтарып беріліп отырғаны жөн. Ол үшін Dispose және FreeMem процедуралары қолданылады.

FreeMem процедурасы нұсқағышта көрсетілген адрес бойынша жад бөлігін босатып, үйіндіге қайтарады.

Транслятор статикалық жадтың көлемін 1 сегментпен, яғни 64 кбайтпен шектейді. Ал динамикалық жад көлемі компьютердің физикалық ресурсымен ғана шектеледі, яғни өте үлкен болуы мүмкін.

 

Жаттығу есептері:

 

1 – мысал. Жадқа көп ұзын жолдық қатарды сақтау керек. Жолдық қатар ұзындығы 256 байт болса, статикалық жадтан бөлінетін қатар саны, 64*1024/256=256 – ға тең болады. Бұдан көп жолдық қатарды сақтау үшін, статикалық жадқа нұсқағышты орналастырып (нұсқағыш 4 байт орын алады), ал жолдық қатарларды динамикалық жадқа көшіреміз.

const

         MaxItem=2000;

type             Pstring=^String;

               TdinMas=array [1.. MaxItem] of Pstring;

var

         p:TDinMas;

         i:integer;

begin

         for i:=1 to MaxItem do new (p[i]);

         p[1]^:=’Сәлем !’;

end.

 

2-Мысал. Кездейсоқ 100 нақты сандардан тұратын динамикалық массив құрып, осы сандардың қосындысын тап.

 

Type tip=real;

vec=array[1..100] of tip;

pt=^vec;

var i:integer; a:pt; s:real;

begin GetMem(a,100*sizeof(tip));

randomize; s:=0;

for i:=1 to 100 do

begin a^[i]:=random; s:=s+a^[i]; end;

write(‘s=’,s:3:3);

FreeMem(a,100*SizeOf(Tip)); readln; end.

 

 

6. Әдебиеттер

1. Н.С. Заурбеков, Б.Ж.Жумажанов. Алгоритмдеу және программалау тілдері. Экономика баспасы. Алматы-2008.

2. Ж.Қ. Масанов, Б.А.Белгибаев, А.С.Бижанова, Қ.Қ.Мақұлов «Turbo Pascal». Алматы 2004.

3. Фаронов В.В.  Тurbo Pascal 7.0. Практика программирования.  Оку құралы.- М.: Нолидж, 2000ж. 416 бет.

 

Мәлімет сізге көмек берді ма

  Жарияланған-2014-06-04 20:12:30     Қаралды-5084

ҚАЗІРГІ ЖАНУАРДЫҢ ҚАЙСЫСЫ ЕҢ КӨНЕ?

...

Қолтырауындар - жартылай суда өмір сүретін ірі жыртқыштар.

ТОЛЫҒЫРАҚ »

АҚШ-ТА РЕСМИ ТІЛ ҚАНДАЙ?

...

Біздің елде қазақ тілі ресми тіл болып заңды түрде танылған.

ТОЛЫҒЫРАҚ »

ҚАЙ ҚАЛАНЫҢ СУ АСТЫНДА ЖОҒАЛЫП КЕТУ ҚАУПІ БАР?

...

20-ғасырдың 60-шы жылдарының басында бір қаланың халқы бірте-бірте су астына батып бара жатыр деген хабардан шошып кетті.

ТОЛЫҒЫРАҚ »

НЕЛІКТЕН АДАМДАР ҒАРЫШҚА ҰШАДЫ?

...

Спутниктер мен орбиталық станциялар ғарышта көптеген жұмыстарды орындайды.

ТОЛЫҒЫРАҚ »

ТҮН НЕГЕ КЕЛЕДІ?

...

Күн артынан түн, түн артынан күн.

ТОЛЫҒЫРАҚ »

НЕЛІКТЕН ТЕҢІЗ БЕТІНДЕ КЕМПІРҚОСАҚ ПЛЕНКАСЫ БАР?

...

Жоқ, бұл жылы жаңбырдан кейін ашық аспанда ойнайтын кемпірқосақ емес.

ТОЛЫҒЫРАҚ »

НЕЛІКТЕН БІЗ АУА ҚЫСЫМЫН СЕЗБЕЙМІЗ?

...

Біздің планетамызда үлкен ауа мұхиты үстемдік етеді.

ТОЛЫҒЫРАҚ »

ҚАБЫЛАН НЕЛІКТЕН ЖЕМТІГІН АҒАШҚА ЖАСЫРАДЫ?

...

Қабылан жалғыз тұрады және арыстандар мен гиеналардан үнемі сақ болу керек.

ТОЛЫҒЫРАҚ »