Программалау тілдері оқулық Қазақстан Республикасы Білім жəне ғылым министрлігі бекіткен Алматы, 2011



Pdf көрінісі
бет21/24
Дата28.01.2017
өлшемі1,6 Mb.
#2918
түріПрограмма
1   ...   16   17   18   19   20   21   22   23   24

283
мəлімет оқуға болмайды жəне керісінше, оқу үшін ашылған 
файлға мəлімет жазылмайды. Жазбалар қосу үшін ашылған файл 
одан мəлімет оқу немесе жазу мақсатында ашылмағаны тек-
серіледі, егер сондай болған жағдайда алдымен ол жабылады да, 
сонан кейін жазбалар қосу үшін қайта ашылады. 
Мəтіндік файлдармен жұмыс істеу кезінде төмендегі арнайы 
процедуралар мен функциялар қолданылады.
1. EOLn( [Var f ] ) функциясы: типі boolean – егер мəтіндік 
файлдағы жол соңы анықталса, TRUE мəнін қайтарады. 
2. Read( [Var f:text;] v1, v2,... vn) процедурасы символдарды, 
жолдарды жəне сан дарды енгізеді. Енгізу тізбегі CHAR, 
STRING, бүтін жəне нақты сандар типін дегі бір немесе 
бірнеше айнымалылардан тұрады. Егер оқу кезінде файл 
көрсеткіші жол соңына барса, нəтиже #13 символы, ал 
файл соңына барса, #26 символы болады. STRING типті 
айнымалы енгізілгенде осы процедурамен оқылып, бір 
жолға орналасатын сөз тіркестерінің ұзындығы жолдың 
максимальды ұзындығына тең болады (егер оған дейін 
жол символдарына қосылмайтын жол соңы немесе файл 
соңы маркері кездесіп қалмаса). Жолдың максималь-
ды ұзындығынан тыс символдар алынып тасталынады. 
Жаңадан Read процедурасымен мəлімет оқу бос жол 
қайтарады. Бұл Read процедурасының бірнеше жолды 
оқымай, тек бір жолды ғана дұрыс қабылдап, қалғандарын 
бос қалдыратынын білдіреді. Сан 
дар 
ды енгізгенде бұл 
процедура алғашқы символға дейінгі барлық босорын, та-
буляция белгілерін алып тастайды да, сөз тіркесін келесі 
босорын не табуляция белгілеріне дейін оқиды. Осылай 
қалыптасқан сөз тіркесі типке сəйкес символдық түрден 
ішкі бейнелеу форматына түрлендіріледі де, тізімдегі 
келесі айнымалыға меншіктеледі. Егер формат бұзылса, 
онда қате тіркеледі, ал файл соңы маркері кездессе, 
айнымалыға 0 мəні меншіктеледі де, ол жайлы ешқан-
дай хабар берілмейді. Read жəне ReadLn процедурала-
ры арқылы логикалық константалар енгізілмейді. Пер-

284
нелерден енгізілген мəліметтер буферге орналасады да, 
олар ENTER басылғанда процедураға беріледі, олардың 
ұзындығы 127 байттан аспауы тиіс. Одан артық символдар 
бір процедура арқылы енгізілмейді. 
3.  ReadLn( [Var f;] v1,v2, ...,vn ) процедурасы да символ-
дарды, жолдарды жəне сандарды енгізеді. Бұл процеду-
ра да Read тəрізді жұмыс істейді, бірақ соңғы айнымалы 
оқылғаннан кейін жолдың соңына дейінгі қалған бөлігі 
алынып тасталады да, келесі ReadLn немесе Read жаңа 
жолдың алғашқы символынан бастап енгізеді. Процедура 
параметрсіз тұрса, онда ол жол соңына дейінгі барлық сим-
волдарды оқымайды. Read процедурасынан кейін ReadLn 
процедурасын параметрсіз пайдалану енгізу буферін та-
залайды. Параметрсіз ReadLn процедурасының алдында 
Read болмаса, ол енгізу əрекетіне көшіп, программа орын-
далуын ENTER басылғанша, тоқтата тұрады да, тұтынушы 
экранын оқуға мүмкіндік береді. 
4.  Write( [Var f;] v1,v2, ...,vn ) процедурасы мəліметтерді 
мəтіндік файлға немесе логикалық құрылғыға шығарады. 
Оның шығару тізімі CHAR, STRING, BOOLEAN жəне 
де бүтін немесе нақты сандар типіндегі бір немесе 
бірнеше өрнектен тұрады. Сандарды шығару кезінде 
олар символдық түрге айнала 
ды. Файлдық айнымалы 
көрсетілмесе, мəлімет стандартты OUTPUT файлы арқылы 
экранға шығарылады. Тізімдегі кез келген параметр мына-
дай форматта болуы мүмкін: 
<параметр> [: <бүтін1> [: <бүтін2> ]], 
мұндағы <бүтін1> мен < бүтін2> шығарылатын мəннің 
ұзындығын көрсетеді. 
5.  WriteLn( [Var f;] v1,v2, ...,vn ) процедурасы да мəліметтерді 
мəтіндік файлға немесе логикалық құрылғыға шығарады. 
Файлдық айнымалы болмаған жағдайда, мəлімет стан-
дартты OUTPUT файлына, яғни экранға шығарылады. Бұл 
процедура Write процедурасымен бірдей, тек шығарылатын 
мəліметтер жолы #13 жəне #10 символдарымен аяқталады. 
Параметрсіз WriteLn файлға жол соңы маркерін (экранға 
мəлімет шығарғанда, келесі жолға көшу) жазады.

285
6.  SeekEOLn( [Var f] ):boolean функциясы алғашқы символ 
таңбасына дейінгі жол соңы жəне табуляция маркерлерін 
немесе барлық босорын таңбаларын алып тастайды да, 
жол соңы маркерін кездестіргенде, TRUE мəнін қайтарады. 
Егер файлдық айнымалы болмаса, ол стандартты INPUT 
файлымен жұмыс істейді. 
7. Функция SeekEOF( [Var f] ):boolean функциясы файл 
соңы таңбасына дейінгі немесе алғашқы символға дейінгі 
жол соңы жəне табуляция маркерлерін немесе барлық бо-
сорын таңбаларын алып тастайды да, файл соңы маркерін 
кездестіргенде, TRUE мəнін қайтарады. Егер файлдық ай-
нымалы болмаса, ол стандартты INPUT файлын тексереді. 
Бірнеше мысал қарастырайық.
6.1-мысал. 26 жолдан тұратын мəтіндік файл құру керек, 
оның əрбір жолына латын алфавитінің бас əріптерінің кез келген 
санын төмендегідей түрде жазып шығу қажет:
AAAAA
BBBBB
C
DDDDDDDDDDDDDDDDDDDDD
EEEEEEEEEEEEEE и т.д.
Program form_text_fi le;
Var
f:text; {мəтіндік файлға арналған файлдық ай-
нымалы}
f:char; n,i:integer; fname,st:string[30];
Begin
WriteLn('Файл атын енгізіңіз'); ReadLn(fname);
Assign(f,fname); {файлдық айнымалыны 
анықтаймыз}
ReWrite(f); {жазбалар үшін файл ашу}
Randomize; {кездейсоқ сандар алуды дайындау}
for a:='A' to 'Z' do {жолдарды құрастыру}
begin
st:='';
n:=Random(30)+1;
for i:=1 to n do st:=st+a;

286
WriteLn(f,st); {мəтіндік файлға жол жазу}
WriteLn(st); {бақылау үшін оны экранға шығару}
end;
Close(f); {файлды жабу}
End. 
Мəтіндік файл ұзындығы əр түрлі болғандықтан, оларды тек 
тізбекті түрде біртіндеп өңдейді (жазу, оқу жəне іздеу). Файлды 
толықтырудың кез келген түрі (оның соңына жазба қосудан басқа) 
оның мəліметтерін басқа файлға жазу арқылы орындалады. 
6.2-мысал. Мəтіндік файлдан барлық «бос» жолдарды – сим-
волдары жоқ жолдар жəне босорын мен табуляция белгілері ғана 
бар жолдарды – алып тастайтын программа жасау керек.
Өңдеу барысында мəтіндік файлдан жолдардың белгілі бір 
бөлігі алынып тастала тын дықтан, файлдың бос емес жолдарын 
сақтайтын арнайы файл жасау керек болады.
Program ex;
Var f1,f2:text; {мəтіндік файлдың файлдық ай-
нымалылары}
st,name:string;
Begin
WriteLn('Файл атын енгізіңіз:'); ReadLn(name);
Assign(f1,name); {файлдық айнымалыны 
тағайындау}
{$I-} {файлдың бар екенін тексеру}
Reset(f1);
{$I+}
if IOResult=0 then {егер осындай атты файл бар 
болса}
begin
Assign(f2,'temp.dat'); {жаңа файл 
тағайындаймыз}
ReWrite(f2); {жазбалар үшін жаңа файл ашу}
while not EOF(f1) do {файл соңына жеткенше}
begin
if SeekEOLn(f1) then ReadLn(f1,st) {егер жол 
бос болса,оны алып тастаймыз}
else

287
begin
ReadLn(f1,st); {жолды оқу}
WriteLn(f2,st); {оны жаңа файлға жазу}
end;
end;
Close(f1); {ескі файлды жабу}
Close(f2); {жаңа файлды жабу}
Erase(f1); {ескі файлды өшіру}
ReName(f2,name); {жаңа файлдың атын өзгерту}
end
else WriteLn('Мұндай аты бар файл табылмады.');
End. 
9.5 Типсіз файлдар
Кез келген файлды ASCII код символдарының тізбегі түрінде 
де қарастыруға болады. Турбо Паскальда файл 128 байттық блок-
тардан тұратын кез келген түрде ұйымдастырылған құрылым деп 
саналады. 
 Типсіз файлдар файлдарды көшіру кезінде қолданылады, 
мұндайда оның жазбаларының ішкі құрылымдық ерекшеліктері 
қарастырылмайды. Егер дискідегі сегмент ұзындығы 1024 байт 
болса, онда блок көлемі 128 байттан болғанда, топтағы блоктар 
саны 8-ге тең.
Мəлімет алмасу тікелей программа мен файл арасында 
буферсіз атқарылады. Блоктарды адрестеу олардың нөмірі бой-
ынша жүргізіледі. Мұнда блоктар файл компоненттері болып са-
налады. Типсіз файлдарды пайдалану компьютер жадын тиімді 
түрде үнемдеуге мүмкіндік береді. 
Типсіз файлдармен жұмыс істеу кезінде 128 символдық блок-
тар тобымен мəлімет алмасатын арнайы процедуралар қарас-
тырылған.
BLOCKREAD(<файл аты>,<айнымалы>,<компоненттер 
саны> 
                
[,<нақты саны>]);
 
бұл процедура файлдан блок оқу үшін қолданылады.
BLOCKWRITE(<файл аты>,<айнымалы>,<компоненттер 
саны>   
                     
[,<нақты саны>]);

288
– файлға блок жазу үшін қажет.
Мұндағы:
<файл аты> - типсіз файл аты;
<айнымалы> - оқу немесе жазу үшін қолданылатын айнымалы 
аты; 
<компоненттер саны> - бір мəлімет алмасу кезінде тасымалдана-
тын компоненттер саны;
<нақты саны - нақты түрде тасымалданған ұзындығы 128 байт 
жазбалар саны.
Блоктар арқылы енгізу-шығаруға арналған файл FILE типімен 
сипатталады. Типсіз файлдар үшін READ жəне WRITE процеду-
ралары қолданылмайды. 
        
VAR <файл аты>: FILE;
Типсіз файл ашқанда, файл жазбаларының ұзындығын байт-
пен көрсетуге болады. Ол RESET немесе REWRITE процедура-
ларын пайдаланғанда, WORD типіндегі екінші параметр түрінде 
жазылады. Егер жазба ұзындығы көрсетілмесе, ол 128 байтқа тең 
болып саналады.
Блоктар арқылы енгізу-шығарудан бір мысал келтірейік. 
FROMF файлы мəліметтерін TOF файлына көшіру керек болсын 
делік.
VAR
FROMF, TOF: FILE;
NR, NWR: WORD;
NAME:STRING[12];
BUF: ARRAY[1..2048] OF CHAR;
BEGIN
     WRITE(‘ОҚЫЛАТЫН ФАЙЛ АТЫ’);   
     READLN(NAME);
ASSIGN(FROMF, NAME);
     WRITE(‘ЖАЗЫЛАТЫН ФАЙЛ Аты‘)$
     READLN(NAME);
ASSIGN(TOF,NAME);  
RESET(FROMF, 1); 
REWRITE(TOF, 1);
REPEAT
   BLOCKREAD(FROMF, BUF, SIZEOF(BUF), NR);

289
   BLOCKWRITE(TOF, BUF, NR, NWR);
UNTIL (NR = 0) OR (NWR <> NR);
CLOSE(FROMF);
CLOSE(TOF);
END.
Программада типсіз файлды ашу кезінде RESET  процеду-
расында жазба ұзындығы 1 болып көрсетілген. Мұнда көшіру 
кезінде жаңа файлға артық символдар жазылмайды.
Бақылау сұрақтары
1.  Файл қайда орналасады жəне қалай белгіленеді?
2.  Файлдармен қандай стандартты функциялар арқылы жұмыс іс-
тейміз?
3.  Файлдармен қандай стандартты процедуралар арқылы жұмыс 
істейміз?
4.  Мəтіндік файлдар қандай болады?
5.  Файлдарды пайдаланатын құрылғылар программада қалай белгі-
ленеді?
6.  Файлдан мəлімет оқу үшін не істеу керек?
7.  Файлға мəлімет жазу үшін не істеу керек?
8.  Бейстандарт типтерді қалай жəне не үшін қолдануға болады?
9.  Физикалық файл дегеніміз не?
10.  Логикалық файл дегеніміз не?
11.  Логикалық файлфизикалық файлмен қалай байланысады?
12.  Файл не үшін жəне қалай ашылады?
13.  Файл қалай жабылады?
14.  Ағымдағы көрсеткіш дегеніміз не?
15.  Файлдарды енгізу-шығару операциясын сипаттаңыз.
16.  Типтелген файлдар арасындағы алмасуларды сипаттаңыз.
Тапсырмалар
1.   N компоненттен тұратын бүтін сандар файлын құрастырыңыз. 
Файлдың тақ индексті компоненттерінің қосындысын табыңыз.
2.   N компоненттен тұратын нақты сандар файлын құрастыры-
ңыз. Файлдың барлық оң компоненттерін олардың квадратта-
рымен алмастырыңыз. Бастапқы жəне өңделген файлды экранға 
шығарыңыз.
3.   N компоненттен тұратын бүтін сандар файлын құрастырыңыз. 
Файлдың ең үлкен санын анықтап, экранға шығарыңыз.
4.   N компоненттен тұратын бүтін сандар файлын құрастырыңыз. 

290
Файл компоненттерін өсу реті бойынша сұрыптаңыз. Бастапқы 
жəне өңделген файлды экранға шығарыңыз. 
5.   N компоненттен тұратын бүтін сандар файлын құрастырыңыз. 
Файлдан барлық теріс компоненттерді алып тастаңыз. Бастапқы 
жəне өңделген файлды экранға шығарыңыз. 
6.   N компоненттен тұратын f бүтін сандар файлын құрастыры-
ңыз. Тағыда g жəне h файлдарын құрастырыңыз. g файлына f 
файлының барлық жұп сандарын, ал h файлына барлық тақ сан-
дарды көшіріңіз. Экранға f, g жəне h файлдарын шығарыңыз.
7.   N компоненттен тұратын f символдар файлын құрастырыңыз. 
Тағы да g файлын құрастырып, оған f файлын кері ретпен 
көшіріңіз. Файлдарды экранға шығарыңыз.
8.   N компоненттен тұратын символдар файлын құрастырыңыз. 
Файлда жиі кездесетін символды анықтаңыз. Экранға осы сим-
волды жəне оның санын шығарыңыз.
9.   N компоненттен тұратын бүтін сандар файлын құрастырыңыз. 
Файлдың -10-нан 10-ға дейінгі сандарын кері санға алмастырыңыз. 
Бастапқы жəне өңделген файлды экранға шығарыңыз.
10.  N компоненттен тұратын бүтін сандар файлын құрастырыңыз. 
Файлдағы барлық 3-ке қалдықсыз бөлінетін сандарды олардың 
үш еселенген көбейтіндісімен алмастырыңыз. Бастапқы жəне 
өңделген файлды экранға шығарыңыз.

291
10. МƏЛІМЕТТЕРДІҢ ДИНАМИКАЛЫҚ ҚҰРЫЛЫМЫ
10.1  Статикалық  жəне  динамикалық  жады  түрлері  жайлы          
жалпы түсінік
Алдыңғы тарауларда, компиляция барысында компьютер жа-
дынан тұрақты орын бөлінетін айнымалыларды қарастырдық. 
Жадының бұл аудандар (VAR бөлімінде сипатталған айнымалылар 
үшін), айнымалы керек болмаса да, программа жұмысын толық 
аяқтағанша сақталады. Бұл жағдайда жады  тиімсіз қолданылады. 
Мəселен, жиымның нақты элементтер саны бойынша баптауын еске 
алайық немесе статикалық жады көлемі үлкен бірнеше жиым сипат-
талса, ал нақты бір уақытта олардың барлығы қолданылмаса.
Жағдайды, жадыны бөлудің арнайы механизімін қолданып 
дұрыстауға болады. Турбо Паскаль тілі, жадыны программаны 
орындау барысында динамикалы түрде бөліп жəне босатып отыруға 
мүмкіндік береді. 
Динамикалық жадының келесі артықшылықтарын атап өтуге бо-
лады:
• 
үнемділігі жəне тиімділігі; 
•  
байланысқан құрылымдарда элементтер санын динамикалық 
түрде өзгерту, мысалы, тізімдерде (статикалық жадыда эле-
менттер саны əр компиляция үшін тұрақты); 
•  
статикалық айнымалылар, өздері сипатталған блок жұмыс 
жасағанда ғана сақталады, ал динамикалық жадыда – блок-
тан шыққаннан кейін де, программа жұмысын аяқтағанша 
сақталады.  Динамикалы  орналасқан айнымалылар VAR бө-
лімінде сипатталмайды жəне олардың программада аттары 
болмайды. Компилятор бұндай айнымалылар үшін жадыдан 
орын бөлуді жоспарламайды. 
10.2 Динамикалық айнымалыларды сипаттау 
жəне оларды қолдану
Программада динамикалық жады бөлігіне қол жеткізу, көрсеткіш 
(сілтеме) деп аталатын, арнайы сілтемелік айнымалы арқылы іске 
асырылады.

292
“Көрсеткіш” типті айнымалыда, онымен байланысқан дина ми-
калық жады бөлімінің адресі жазылады. Компилятор “көрсеткіш”  
типті айнымалыға статикалық жадыдан төрт байт орнын бөледі. 
Əдетте, белгілі бір типтегі мəліметтермен байланысқан көрсеткіш 
типтелген деп аталады. Бірақ ол типсіз, кез келген типтегі мəліметтер 
көрсеткішімен байланысқан болуы мүмкін. Бұл жағдайда көрсеткіш 
бос (байлаусыз) деп аталады. 
“Көрсеткіш” типінің сипатталу форматы:
 
TYPE <көрсеткіш идентификаторы>=^<тип>;
“Көрсеткіш” типі мен “көрсеткіш” типтегі айнымалыларды си-
паттау мысалдары. 
TYPE  { типтерді дұрыс хабарлау }
P1=^WORD; { p1 – WORD типті мəндердің “көрсеткіш” типінің 
идентификаторы} 
P2=^CHAR;   { p2 - CHAR типті мəндердің “көрсеткіш” типінің 
идентификаторы} 
P4=ARRAY[1..10] OF ^REAL; {p4 - REAL типті мəндерге 
 
сілтеме жасайтын, көрсеткіш жиымдарының “көрсеткіш” типінің 
идентификаторы.} 
                   { типтерді қате хабарлау }
   P5=^ARRAY[1..10] OF REAL;
P6=^STRING[25];  
P7=^RECORD  
FIELD1: STRING [15];
    FIELD2: REAL;             
END; 
“Көрсеткіш” типінің сипатталу форматында тип идентифика-
торы көрсетілу керек, сондықтан стандартты идентификаторларды 
(INTEGER, REAL жəне т.б.) бірден “көрсеткіш” типінің сипатта-
луында жазуға болады. P5, P6 жəне P7 типтерінің сипатталуындағы 
қателерді компилятор, бұндай жағдайда алдымен тип идентифика-
торын сипаттап, сонан кейін оны басқа сипаттауларда қолдану керек 
болғандақтан көрсетеді.   
Келесі сипаттаулар дұрыс болады: 
      TYPE 
... 
MAS=ARRAY[1..10] OF REAL; 
ST=STRING[25]; 

293
REC=RECORD          
FIELD1: STRING [15];
FIELD2: REAL;             
END; 
VAR 
P5: ^MAS;
P6: ^ST;
P7: ^REC;  
... 
Көрсеткіш келесі үш қалып-күйдің бірінде болуы мүмкін: 
1. əлі инициализацияланбаған; 
2. орналастыру адресі бар; 
3. алдын ала анықталған NIL тұрақтысының мəні жазылған; 
мұндай көрсеткіш бос көрсеткіш деп аталады, демек ешқандай ай-
нымалыны көрсетпейді. NIL мəнде көрсеткіштің əр төрт байттында 
0 жазылады.
Көрсеткіштерді басқа көрсеткіштермен салыстыруға (=, <>), 
оларға адрес беруге немесе басқа көрсеткіштің мəнін меншіктеуге, 
параметр ретінде беруге болады. Көрсеткішті баспадан шығаруға 
жəне экранда бейнелеуге болмайды.
Бөлінген динамикалық жадыға қол жеткізу төмендегідей кодта-
лады:
<көрсеткіш идентификаторы >^
Динамикалық жадыда орналасқан айнымалыларға қол жеткізу 
мысалын қарастырайық: 
TYPE 
SYM=^CHAR; 
ZAP=RECORD         
FIELD1, FIELD2: REAL; 
   END;
M=ARRAY[0..9] OF WORD; 
VAR 
CH: SYM; 
REC: ^ZAP; 
MAS: ^M;
... 
CH^:='*';  {CHAR типті динамикалық айнымалыға қол жеткізіп, 
ол ауданға жұлдызша символын жазу}

294
... 
READLN (REC^.FIELD1);      {динамикалық жазбаның FIELD1 
өрісіне қол жеткізу, оған пернетақтадан мəндер енгізу}
...
WRITELN (MAS[5]^);   {динамикалық жиымның MAS[5] 
элементіне қол жеткізу, көрсетілген элемент мəнін экранға шығару}
...
CH^, REC^.FIELD1  жəне MAS[5]^ адрестері программада 
соларға сəйкес СH, REC жəне MAS  көрсеткіштерінде жазылған 
динамикалық объектілер рөлін атқарады деуге болады. 
POINTER типті айнымалыларға қол жеткізу (көрсеткіші еш-
қандай нақты типті көрсетпейтін жəне кез келген типтегі көрсет-
кіштермен үйлесімді) қатеге алып келетіндігін айта кету керек.
Например.
VAR
P:POINTER;
...
P^:=1; {қате!}
10.3 Динамикалық жадымен жұмыс істеуге арналған 
процедуралар мен функциялар 
Динамикалық жадыға орналастыруға жəне босатуға ар-
налған стандартты процедуралар 
 
Программа орындалу барысында, динамикалық жадыны қол-
данатын кездер болады, мысалы: жадыны керекті түрде бөлу, ол 
жерге қандай да бір мəндерді орналастыру, олармен жұмыс істеу 
жəне ол мəндер керек болмаған жағдайда жадыны босату, т.с.с.
Динамикалық жадыны екі тəсілмен бөлуге болады: 
1. NEW процедурасының көмегімен: 
New (P);
мұндағы Р - «типтелген көрсеткіш»  типті айнымалы.
Бұл процедура жаңа динамикалық айнымалы жасайды (ол үшін 
жадыдан орын бөледі) жəне оған P көрсеткішін орналастырады 
 
(P-да жадының бөлінген ауданының адресі жазылады). Бөлінетін 
ауданнық мөлшері мен құрылымы, P көрсеткіші байланысқан 

295
типтегі мəндерге берілетін жады көлеміне байланысты. Жасалған 
айнымалы мəніне  P^ көмегімен қол жеткізуге болады. 
2. GETMEM процедурасының көмегімен:
GetMem (P,size);
мұндағы  P – қажет типтегі “көрсеткіш” типті айнымалы.
size – сұралған жады мөлшерін байтпен көрсететін бүтін санды 
өрнек.
Бұл процедура қажет қасиеттері жəне мөлшері бар жаңа ди-
намикалық айнымалы жасайды. Айнымалының адресін “көр сеткіш” 
типті  Р айнымалысына орналастырады. Жаңа жасалған айнымалы 
мəніне қол жеткізу P^ көмегімен іске асырылады. 
Мысалы:
TYPE
REC=RECORD
FIELD1:STRING[30];
FIELD2:INTEGER;
  END;
PTR_REC= ^REC;
VAR
     P:PTR_REC;
BEGIN
GETMEM(Р, SIZEOF (REC));  {жады бөлу, бөлінген аудан 
адресі  Р-да жазылады; бұл жадының байтпен берілген мөлшерін 
сипатталған типтегі мəндерге қолданылатын, стандартты SizeOf 
функциясы анықтап, қайтарады; алайда, қолданылатын өрістердің 
ішкі берілу мөлшерін біле отырып, жады мөлшерін қолмен есептеп,  
SizeOf (Rec) орнына тұрақты ретінде жазуға болады}
...
{жадыны пайдалану}
...
FREEMEM(P, SIZEOF(REC)); {қажет емес жадыны босату}
...
Динамикалық жадыны төрт тəсілмен босатуға болады.
1.  Автоматты түрде, барлық программа аяқталғаннан кейін.
2. Стандартты 
DISPOSE процедурасының көмегімен.
Dispose (P); 
мұндағы        P – “көрсеткіш” типті айнымалы (типтелген).
DISPOSE(P) процедурасының жұмысының нəтижесінде, P 
көрсеткішімен байланысқан жады ауданы, алдағы уақытта қолдануға 

296
болатын бос аудан ретінде белгіленеді. Бірақ P көрсеткіші жəне 
онымен байланысқан жады физикалық түрде тазаланбайды, жазба 
экземплярын өшіріп тастап та оның өрістерінің мəнін алуға болады, 
алайда бұл жағадайды қолдануға кеңес берілмейді.  
 
DISPOSE  процедурасының қолдану тəсілдері əр түрлі бо ған-
дықтан, бұл процедураны MARK жəне RELEASE процедуралары-
мен бірге қолдануға болмайды.
2. FRЕЕМЕM процедурасының көмегімен. 
FreeMem (P, size);
мұндағы    P - “көрсеткіш” типті айнымалы,
size – босатылатын  жады мөлшерін байтпен көрсететін бүтін 
санды өрнек.
Бұл процедура жадыны,  P  көрсеткішімен байланысқан, SIZE 
өрнегінің мəнінен тең мөлшермен, бос жады ретінде белгілейді 
(GETMEM мысалын қараңыз).

Достарыңызбен бөлісу:
1   ...   16   17   18   19   20   21   22   23   24




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

    Басты бет