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     Қаралды-5083

ОДАҢ ОЙЛАСЫ

...

Шайқалған кәмпит массасынан тұратын тағам осылай деп аталады.

ТОЛЫҒЫРАҚ »

ЖЕР ШАРЫНДА ҚАНША МҰХИТ БАР?

...

Барлық теңіздер мен мұхиттар бірігіп Жер бетінің 2/3-тен астамын алып жатыр.

ТОЛЫҒЫРАҚ »

Хан отбасы мүшелерінің ұшуының өз ережелері бар

...

Сол уақыттарда қарапайым адамдар сияқты жалпыға бірдей ұшу ережелерін сақтау тиіс еді, оған қоса хан отбасының өз ережелері бар.

ТОЛЫҒЫРАҚ »

ЕҢ ҮЛКЕН ПЛАНЕТА ҚАЙСЫ?

...

Бүкіл күн жүйесіндегі ең үлкен, ең ауыр планета – Юпитер (Есекқырған) екен.

ТОЛЫҒЫРАҚ »

СУРЕТШІ ИЛЛЮСТРАЦИЯНЫ ҚАЛАЙ ЖАСАЙДЫ?

...

Біз суретті кітапты ашып қарағанымызда, басқа бір әлемге тап болғандай әсер аламыз. Әлгі суреттерде өлі кейіпкерлер тіріліп, кітапта айтылатын оқиға өткен ел мен жер қаз-қалпында сайрап көз алдымызда тұра қалады.

ТОЛЫҒЫРАҚ »

ҒАЛАМШАРДЫҢ ӘР ТҮКПІРІНДЕ ШУАҚ КҮНДЕРІ ҚАНША?

...

Табиғатта нашар ауа райы жоқ. Жағымсыз климат болады. Себебі адам өзінің айқын жағдайларда әр түрлі көңіл сезеді:

ТОЛЫҒЫРАҚ »