Программалау іі» пәні бойынша 050111 «Информатика»



бет3/29
Дата14.06.2016
өлшемі2.7 Mb.
#135126
түріПрограмма
1   2   3   4   5   6   7   8   9   ...   29


Қазақстан Республикасы

Білім және ғылым министрлігі

«Сырдария » университеті



«Физика және математика» факультеті


«Информатика» кафедрасы

«Программалау ІІ» пәні бойынша


050111 - «Информатика» мамандықтарының студенттері үшін

Лекцияның Қысқаша курсы

Жетісай – 2008 ж




9. Лекция сабақтары

Лекция 1

Динамикалық жады және көрсеткіштер


Жоспар:

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

2. Адрестер және көрсеткіштер

3. Көрсеткіштерді жариялау


Әдебиеттер:


1.А.Г.Гольцев «Объектно-ориентированное программирование и его реализация в языке Паскаль», Москва-2005

2. В.В.Фараонов «Турбо Паскаль 7.0», Москва-2001

3. Электронный учебник: «Введение в объектно-ориентированное программирование», 2006
1. Динамикалық жады

Программада жарияланған барлық айнымалылар жедел жадының берілгендер сегменті деп аталатын бір үзіліссіз бөлігінде орналасады. Берілгендер сегментінің ұзындығы 80х86 микропроцессорлер архитектурасымен айқындалады және 65536 байтты құрайды. Мұндай өлшем үлкен берілгендер массивін өңдеу кезінде қиындықтар тудырады. Дербес компьютердің жады көлемі үлкен көлемді берілгендерді өңдеуге әбден жеткілікті. Жағдайдан шығудың жолы динамикалық деп аталынатын жадыны пайдалану.



Динамикалық жады-бұл дербес компьютердің программаға берілгендер сегментін(64 КБ), стекті(әдетте 16КБ) және программаның өз денесін қоспағандағы пайдалануға беретін оперативті жадысы. Динамикалық жадының көлемі үнсіз келісім бойынша ДК-ң барлық жады көлемін құрайды.

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

Берілгендердің динамикалық орналастыру дегеніміз – бұл программаның жұмысы кезінде динамикалық жадыны тікелей пайдалану. Ал, берілгендердің статикалық орналастыру компилятор арқылы программаны компиляция жасау кезінде орындалады. Динамикалық орналасуда алдын ала орналастырылатын берілгендердің не көлемі, не типі белгілі болмайды, бұл берілгендерді статикалық айнымалылар сияқты атауы бойынша қолдануға болмайды.

2. Адрестер және көрсеткіштер

ДК-ң оперативті жадысы мәліметтерді сақтауға арналған э лементар ұяшықтардың-байттардың жиынтығынан тұрады. Олардың әрқайсысының номері бар. Бұл номерлер адрестер деп аталады. Солардың арқасында жадының кез-келген байтына пайдалануға болады.

Турбо Паскальда динамикалық жадыны басқарудың жеңіл құралы – көрсеткіштер боп табылады. Көрсеткіш- бұл айнымалы, оның мәні ретінде жадыдағы белгілі бір байттың адресі алынады.

ДК-де адрестер сегмент және жылжу де аталатын екі 16-разрядты сөздермен беріледі. Сегмент – бұл ұзындығы 65536 байтқа (64КБ) тең және 16-ға бөлінетін (яғни 0, 16, 32, 48, т.с.с.) физикалық адрестен басталатын жады бөлігі. Жылжу- бұл керекті адресті алу үшін сегменттің басынан қанша байт тастап, жылжу керектігін көрсетеді. ДК-ң адректік кеңістігі 1 Мбайтты құрайды(ДК-ң стандартты деп аталатын жадысына қатысты айтылып тұр, қазіргі уақыттың адрестік кеңестігі 40-80Гбайтты құрайды, алайда қосымша жадыны пайдалануға мүмкіндік беретін құралы Турбо Паскальда жоқ, Воrland Pascal with Objects 7.0 –те бар) 1 Мбайт көлемін адрестеу үшін 20 екілік разряд қажет. Ол екі 16 разрядты сөздерден (сегментжәне жылжу) былайша құрылады: сегмент мәні солға қарай 4 разрядқа жылжиды, босап қалған оң жақтағы разрядтар нольмен толтырылады да бұл мән жылжу мәнімен қосылады.



15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

0

Сегмент


+


15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

0
Жылжу

=


19

18

17

16

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

0
Адрес
16 байттық жады фрагменті параграф деп аталады. Сондықтан, сегмент параграфқа дейінгі дәлдікпен, ал жылжу байтқа дейінгі дәдікпен жадыны адрестейді. Әрбір сегментке үздіксіз және жеке адрестелген жады облысы сәйкес келеді. Жадыда сегменттер бірінен кейін бірі жалғасып орналасуы, немесе қайсыбір интервал тастап орналасуы, немесе бірін бірі жауып(қиылыса) орналасуы мүмкін.

Осылайша, өзінің ішкі құрылымы бойынша әрбір көрсеткіш екі сөзден (WORD типіндегі берілген) сегмент және жылжудан тұрады. Көрсеткіш көмегімен динамикалық жадыға Турбо Паскалдағы кез-келген типтегі берілгендерді орналастыруға болады. Олардың кейбіреулері ғана жадыда бір байт иелейді(BYTE, CHAR, SHORTINT, BOOLEAN), ал қалғандары –көрші орналасқан бірнеше байттарды иелейді. Сондықтан іс-жүзінде көрсеткіш берілгендердің тек бірінші байтын ғана адрестейді.


3. Көрсеткіштерді жариялау

Әдетте Турбо Паскалда көрсеткіштер қайсыбір берілгендер типімен байланыстырылады. Мұндай көрсеткіштерді типтендірілген деп атаймыз. Типтендірілген көрсеткішті жариялау үшін ^белгісі қолданылады. Бұл белгі сәйкес типтің алдына қойылады. Мысалы:


Var

p1: ^integer;

p2: ^integer;

type


PerconPointer = ^PerconRecord;

PerconRecord = record

Name : string;

Job : string;

Next : PersonPointer

end;
Көңіл аударыңыз: PersonPointer типін жариялауда PerconRecord типіне сілтедік, ал ол программада алдын-ала жарияланбаған. Бізге белгілі, Турбо Паскалда барлық айнымалылар қолданудан алдын сипатталуы керек. Бұл ереже көрсеткіштер үшін қолданылмайды. Көрсеткіштер әлі жарияланбаған берілгендер типіне сілтеме жасай алады. Осының арқасында динамикалық жады берілгендерді тізім түрінде ұйымдастыру(кейбір программаларда кеңінен қолданылады) мүмкіндігін береді. Тізімнің әрбір элементінің құрамында келесі элементтің көрсеткіші бар болады. Бұл тізімді қарап шығу және дұрыстауға мүмкіндік береді.


Турбо Паскалда көрсеткішті ешқандай нақты бір берілгендер типімен байланыстырмай жариялауға болады. Бұл үшін РОINTER стандартты типі пайдаланылады. Мысалы:

var


p: pointer;

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

Айтылып кеткендей, көрсеткіш мәні бұл айнымалының жадыдағы адресі, сондықтан бір көрсеткіштің мәнін екіншісіне беруге болады деп ойлауымыз мүмкін. Шын мәнінде бұл басқашалау болады. Турбо Паскалда бірдей берілгендер типімен байланыстырылған көрсеткіштер арасында ғана бірінің мәнін екіншісіне беруге болады. Мысалы, егер

var


p1, p2: ^integer;

p3 : ^real;

pp : pointer;

онда


p1:=p2; деп меншіктеуге болады,

ал


p1:=p3; деп меншіктеуге болмайды. Өйткені, р1, р3 әртүрлі берілгендер типіне сілтеме жасайды. Алайда, бұл шектеме типтендірілмеген көрсеткіштер үшін қойылмайды. Сондықтан былайша жаза аламыз:

рр:=p3;


p1:=pp;
Шектеме қойып және оны айналып өтудің жолын тағы берудің қажеті барма екен деуіңіз мүмкін. Мәселе мынада, кез-келген шектеме бір жағынан программаның сенімділігін арттыру үшін ендірілсе, екінші жағынан тілдің қуатын шектейді, қайсыбір жағдайлар үшін қолдануға жарамсыз етеді.



Достарыңызбен бөлісу:
1   2   3   4   5   6   7   8   9   ...   29




©dereksiz.org 2024
әкімшілігінің қараңыз

    Басты бет