Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
УМК _АСДиП_ 25-06-2012 kz.doc
Скачиваний:
61
Добавлен:
25.05.2015
Размер:
1.94 Mб
Скачать

Көрсеткіштер туралы қысқаша мағлұматтар

Компьютердің жадысы ұяшықтардың жиыны болып табылады. Қайсыбір байттың адресін қолданып жадының кез-келген байтына қатынас жасауға болады. Динамикалық жадыны басқару үшін көрсеткіштер қолданылады. Мәні ретінде жады байтының адресін сақтайтын айнымалы көрсеткіш болып табылады. Компьютерде адрестер сегмент және ығысу деп аталатын екі 16-лық сөздер арқылы анықталады. Сегмент-жадының бөлігі 64 Кбайт және 16 еселік болатын физикалық адрестен басталады (0,16,32,48,т.с.с). Қажетті адреске қатынас жасау үшін сегменттің басынан қанша байт аттап өту керек екенін ығысу көрсетеді. Турбо Паскаль тілінде көрсеткіштер мәліметтердің қайсыбір типімен байланысады. Осындай көрсеткіштер типтелген деп аталады. Төменде типтелген көрсеткіштердің мысалдары келтірілген:

Var pr1: ^ integer;

pr2: ^ real;

Динамикалық жады қайсыбір программада көп қолданылатын тізім түрінде мәліметтердің ұйымдастыруын іске асыру үшін мүмкіндік береді. Тізімнің әрбір элементі жазба түрінде сипатталады. Жазба өрістерінің біреуінде келесі элемент туралы ақпарат орналасады. Бұл өріс келесі элементке сілтейтін көрсеткіш деп аталады. Қалған өрістер немесе бір өріс ақпаратты өрістер болып табылады. Тізімдер келесі түрде сипатталады:

TYPE sledel=^el; el=record

FIO:string[30];

Sled:sledel;

End;

Sledel типті сипаттағанда программада бұрын анықталмаған el типі пайдаланған. Бұл жағдайда тек көрсеткіштер үшін ерекшелік қарастырылған:сипатталмаған мәліметтер типіне көрсеткіштер сілтеуі мүмкін. Динамикалық орналасатын айнымалыға жады “new” стандартты процедура арқылы бөлініп беріледі. Бұл процедураның параметрі ретінде типтелген көрсеткіш қарастырылады. New процедураға қатынас жасағаннан кейін көрсеткіштің мәні болып динамикалық жадының адресі анықталады және осы адрестен бастап мәліметтер орналасады. Көрсеткіш қайсыбір мәнді меншіктегеннен кейін яғни, ол жадының нақты физикалық байтына сілтейтін болады және осы адрес бойынша сәйкес типті кез-келген мәнді орналастыруға болады.

NEW(pr1);

Динамикалық жадыны босату үшін Dispose стандартты процедурасын пайдалануға болады.

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

Белгілі бір типпен байланыспаған көрсеткіштер типтелмеген деп аталады және стандартты pointer типімен баяндалады, мысалы:

VAR p: pointer;

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

Мысалы:

Var

pr1, pr2 : ^ integer;

pr3: ^ real;

ptr : pointer;

Дұрыс меншіктеудің мысалы:

1) pr1 : = pr2;

2) pr1 : = pr3; - меншіктеу дұрыс емес, өйткені Pr1 және Pr3 мәліметтердің әртүрлі типтерене сілтеген. Бұл шектеу типтелмеген көрсеткіштерге қарастырылмаймайды:

ptr := pr3; pr1 := ptr ( 2) орнына )

Негізгі әдебиет: 1[140-156]

Қосымша әдебиет:5 [28-32], 10 [125-146], 12 [61-174].

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

  1. Динамикалық айнымалылар қандай жағдайда пайдаланылуы мүмкін?

  2. Динамикалық айнымалының адресіне компьютер жадысында қандай көлем бөлінеді?

  3. NEW және DISPOSE процедуралары қандай қызметті атқарады?

  4. GETMEM және FREEMEM процедуралары қандай көрсеткіштерге пайдаланылады?

  5. Көрсеткіштердің қандай түрлері бар.

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

Барлық динамикалық жады үйме деп аталатын бірыңғай байттар массиві ретінде қарастырылады. Физикалық тұрғыдан алғанда үйме программа денесінен тұратын жады облысынан кейін үлкен адрестерде орналасады. Үйменің басы heaporg стандартты айнымалыда, ал соңы heapend айнымалысында сақталады. Бос емес динамикалық жадының ағымдық шекарасын heapprt көрсеткіші көрсетеді.

Кез келген динамикалық тұрғыда орналасқан айнымалыға жады new процедурасының көмегімен бөлінеді. Бұл процедураға қатынау параметрі болып типтелген көрсеткіш табылады. Қатынау нәтижесінде көрсеткіш мәліметтерді орналастырып бастауға болатын динамикалық адреске сәйкес мәнге ие болады. Көрсеткіш белгілі бір мәнге ие болғаннан кейін, яғни жадының нақты физикалық байтына көрсете бастаса, бұл адрес бойынша сәйкес типтің кез келген мәнін орналастыруға болады. Ол үшін көрсеткіштен кейін « ^ » белгісі қойылады, мысалы:

I ^ : = 2; r ^ : = 2*pi;

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

Мысалы: new(pr1);

Динамикалық жадыны босату үшін dispose стандартты процедурасын пайдалануға болады.

Үймеге жадыны динамикалық қайтару үшін dispose(ptr) процедурасы қолданылады. dispose(ptr) процедурасы ptr көрсеткішінің мәнін өзгертпейтінін, бұрын осы көрсеткішпен байланысқан жады үймесін ғана қайтаратынын айта кетуге болады. Бос көрсеткішті nil сөзімен белгілеуге болады.

Үйменің бүтін бөлігін босату үшін динамикалық жадыны бөлуді бастамас бұрын heapprt көрсеткішінің ағымдық мәні mark процедурасының көмегімен айнымалы-көрсеткіште сақталады. Бұдан кейін кез келген уақытта mark процедурасында сақталған адрестен бастап, динамикалық жадының аяғына дейін үйме бөлігін босатуға болады. Ол үшін release процедурасын қолдануға болады, мысалы:

var p, p1, p2, p3, p4, p5 : ^ integer;

begin

New (p1); new (p2); mark (p); new (p3); new (p4);

New (p5); ------------ release (p);

end.

release процедурасын шақыру осыған дейін dispose процедурасымен құрылған үймедегі бос бөліктер тізімін жоятынын ескерейік, сондықтан бір программаның негізінде жадыны босатудың екі механизмін бірге қолдануға болмайды

Типтелмеген көрсеткіштермен жұмыс жасау үшін келесі процедурулар қолданылады:

GETMEM(P, SIZE) – жадыға орын бөлу;

FREEMEM(P, SIZE) – жадыны босату.

Мұнда Р – типтелмеген көрсеткіш.

SIZE – үйменің босатылған немесе талап етілген бөлігінің байт түріндегі размері.

GETMEM процедурасымен үймеге бір рет қатынағанда 65521 байтқа дейін динамикалық жадыға орын бөле алады. GETMEM – FREEMEM процедураларын қолдану барлық динамикалық жадымен жұмыс жасау тәрізді ерекше ұқыптылықты талап етеді: жадыға қанша орын бөлінсе дәл сондай орын ғана бөліну керек және оған орын бөлінген адрестен бастап қана.

Төменде динамикалық жадымен жұмыс істеу үшін қолданылатын процедуралар мен функциялар келтірілген.

ADDR (X)- Х аргументінің адресін анықтайды.

DISPOSE (TP) – TP типтелген көрсеткіштерге резервтелген динамикалық жадының бөлігін түйдекке қайтару.

FREEMEM (P, SIZE) – байтпен берілген SIZE өлшемді Р типтелмеген көрсеткішке резервтелген түйдек бөлігін босатады

GETMEM (P, SIZE) - байтпен берілген SIZE өлшемді түйдек бөлігін Р типтелмеген көрсеткішке резервтейді.

MARK (PTR) – HEAPPTR түйдегінің көрсеткішінің ағымдағы мәнін еске сақтайды.

MAXAVAIL – ең үлкен үздіксіз түйдек бөлігінің өлшемін байтпен қайтарады.

MEMAVAIL – түйдектің жалпы бос кеңістігінің өлшемін байтпен қайтарады.

NEW (TP) – айнымалы орналастыру үшін ТР типтелген көрсеткіш көмегімен түйдек бөлігін резевтеу.

RELEASE (PTR) – түйдек соңына дейін PTR көрсеткішінде сақталған адрестен түйдек бөлімін босатады.

SIZEOF (X) – көрсетілген объектінің ішкі түсінігінің ұзындығын байт өлшемімен қайтарады.

Негізгі әдебиет:1[151-156]

Қосымша әдебиет: 5 [28-32], 6 [164-207], 8 [174-176].

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

  1. NEW және GETMEM процедуралардың айырмашылықтары қандай?

  2. MEMAVAIL және MAXAVAIL процедуралары қандай жағдайда пайдаланылады?

  3. SIZEOF функциясы қандай мәнді қайтарады?

  4. Аргументтің адресін қандай функция анықтайды?

  5. MARK және RELEASE процедуралары қандай жағдайда пайдаланылады?

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]