Dastur kodi
Mazkur dasturning kodi qatorni belgilar massiviga va belgi va uning kodini Memo1 shaklida aks ettiriluvchi bevosita kodga almashtiruvchi protsedurani o‘z ichiga oladi. Bu vazifani amalga oshiruvchi protseduraga Edit1 komponentining onChange xodisasi mos qo‘yilgan. Shu yo‘l bilan birga bu komponent almashganda avtomatik ravishda Memo1 ob’yektining tarkibi ham o‘zgaradi.
void AnsiStringToCharPointer(char * c, AnsiString s, int n = 0)
{
int k = s.Length();
if(k > n && n != 0){ k = n; }
for(int i = 0; i < k; i++)
{
c[i] = s[i+1];
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Edit1Change(TObject *Sender)
{
Memo1->Text = "";
int l = Edit1->Text.Length();
char c[100];
AnsiStringToCharPointer(c, Edit1->Text,100);
for(int i = 0; i < l; i++)
{
AnsiString h = c[i];
AnsiString q = h + " q " + IntToStr(*((byte*)(c+i)));
Memo1->Lines->Add(q);
}
}
7. Xotirani dinamik taqsimlash Xotirani zaxiralash
C++ da o‘zgaruvchilar yo statik - kompilyatsiya paytida, yo standart kutubxonadan funksiyalarni chaqirish yo‘li bilan dinamik - dasturning bajarilish paytida, joylanishi mumkin. Bu usullarni ishlatishning asosiy farqi ularning effektivligida va moslanuvchanligidadir. Statik joylashtirish birmuncha effektivroq, chunki xotira ajratish dastur bajarilishidan oldin bajariladi. Ammo uning moslanuvchanligi ancha pastroq, chunki bu holda biz joylashtiriladigan ob’yektlarning turlari va o‘lchamlarini oldindan bilishimiz zarur. Masalan, matn fayllarni qatorlarning statik massivida, uning o‘lchamini oldindan bilish zarurligidan, joylashtirish ancha qiyin. Ayniqsa, oldindan noaniq sonli elementlarni saqlash va qayta ishlash bilan bog‘liq masalalar uchun xotirani dinamik taqsimlash usulidan foydalanish qulay.
Xotirani statik va dinamik taqsimlash o‘rtasidagi asosiy farq quyidagilar:
Statik ob’yektlar nomlangan o‘zgaruvchilar bilan belgilanadi. Shu sababli bunday ob’yektlar ustida amallar bevosita ularning nomlarini ishlatish orqali amalga oshiriladi. Dinamik ob’yektlar shaxsiy nomga ega bo‘lmaydi, ular ustidagi amallar bilvosita, ya’ni ko‘rsatkichlar yordamida bajariladi;
Statik ob’yektlar uchun xotira ajratish va bo‘shatish kompilyator tomonidan avtomatik ravishda bajariladi. Dasturchining bu haqda bosh qotirishi shart emas. Dinamik ob’yektlar uchun xotira ajratish va bo‘shatish butunligicha dasturchining zimmasiga tushadi. Bu esa hal qilishda xatoga yo‘l qo‘yish mumkin bo‘lgan murakkab masaladir.
Dinamik ajratilgan xotira bilan ish ko‘rish uchun new va delete buyruqlaridan foydalaniladi.
Shu paytgacha barcha misollarda xotirani statik ajratish usulidan foydalanilib kelindi. Masalan, i o‘zgaruvchini aniqlash quyidagicha bajarilar edi:
int i = 1024;
Bu buyruq xotirada int turidagi o‘zgaruvchini saqlash uchun zarur bo‘lgan soha ajratadi, bu sohani i nom bilan bog‘laydi va u joyga 1024 qiymatni yozib qo‘yadi. Bularning barchasi dasturning bajarilishigacha bo‘gan kompilyatsiya paytida bajariladi.
O‘zgaruvchi uchun joy ajratishning yana bir usuli mavjud bo‘lib, u new buyrug‘ini ishlatish yordamida bajariladi.
new buyrug‘i ikkita shaklga ega bo‘ladi. Birinchi shaklda aniq turli birlik ob’yekt uchun joy ajratadi:
int *pint = new int(1024);
Bu yerda new buyrug‘i int turidagi nomsiz ob’yekt uchun joy ajratadi, uni 1024 qiymat bilan initsializatsiya qiladi va hosil qilingan ob’yektning manzilini uzatadi. Bu manzil pint ko‘rsatkichiga joylashtiradi. Bunday nomsiz ob’yektlar ustidagi barcha amallar mazkur ko‘rsatkich bilan ishlash orqali bajariladi, chunki dinamik ob’yektlar ustida bevosita ishlash mumkin emas.
Ikkinchi shaklda new buyrug‘i ma’lum tur elementlaridan tashkil topgan, ko‘rsatilgan o‘lchamdagi massiv uchun xotira ajratadi:
int *pia = new int[4];
Bu misolda int turidagi to‘rt elementdan iborat massiv uchun xotira ajratiladi. Afsuski, new buyrug‘ining bu shaklida massiv elementlarini initsializatsiya qilish imkoniyati yo‘q.
new buyrug‘ining ikkala shaklida ham bir xil ko‘rsatkich aniqlanishi ba’zi chalkashliklarga olib kelishi mumkin. Qaralayotgan misolda bu butun turga ko‘rsatkichdir. pint ham, pia ham bir xil e’lon qilingan, ammo pint int turidagi yagona ob’yektni ko‘rsatadi, pia esa int turidagi to‘rtta ob’yektdan iborat massivni ko‘rsatadi.
Dinamik ob’yekt kerak bo‘lmay qolganda unga ajratilgan sohani oshkor ravishda bo‘shatish mumkin. Bu delete buyrug‘i yordamida bajariladi:
delete pint;
Massivni bo‘shatish ham new buyrug‘i kabi ikki shaklga ega, birlik ob’yekt uchun va massiv uchun.
delete[] pia;
Agar ajratilgan xotirani bo‘shatishni unutsak, u bo‘shga sarflanadi, ishlatilmaydi. Agar unga bo‘lgan ko‘rsatkich o‘z qiymatini o‘zgartirgan bo‘lsa uni tizimga qaytarish ham mumkin emas. Bunday xodisa xotiraning oqib ketishi degan maxsus nom olgan. Oxir oqibatda dastur xotira etmasligi sababli halokatli (avariyali) to‘xtaydi (agar u uzoq vaqt ishlasa).
Dostları ilə paylaş: |