Ko‘rsatkichlar bilan ishlashni ko‘rgazmali tasvirlash uchun ixtiyoriy kiritilgan qator belgilari kodini tasvirlovchi dastur yozamiz.
Belgilar operativ xotirada ASCII jadvali kodlari sifatida saqlanadi, shuning uchun ham belgilarning kodlarini bilish uchun xotira yacheykasidagi byte turidagi o‘zgaruvchi ko‘rinishida saqlanayotgan belgini o‘qish kifoya.
Bunday dasturni yozish uchun belgilar massivi bir xil elementlar to‘plamining ketma-ketligi ekanligidan, ularga ko‘rsatkichlarni ma’lum sondagi baytlarga siljitish yordamida murojaat qilish mumkinligidan foydalanish mumkin.
Muammolar
Mazkur dasturning eng katta muammosi shundaki, Edit turi ko‘rinishidagi ob’yektlar o‘z matn qiymatlarini AnsiString turidagi, belgilar massivi bo‘lmagan o‘zgaruvchilarda saqlaydi. Ya’ni mazkur dasturni yaratish uchun AnsiString turidagi o‘zgaruvchilarni belgilar massiviga almashtiruvchi protsedura yozishga to‘g‘ri keladi.
Zarur ko‘nikmalar
Mazkur dastur uchun zarur bo‘lgan asosiy ko‘nikma xotira bilan o‘zgaruvchilar bilan ishlash orqali emas, balki to‘g‘ridan-to‘g‘ri, ko‘rsatkichlarni siljitish orqali ishlash ko‘nikmasidir. Undan tashqari, turli xil tur ma’lumotlarining xotirada egallaydigan hajmini bilish, bir turni ikkinchisiga o‘tkazishni bilish kerak bo‘ladi.
Yana qatorlar bilan ishlashni bilish kerak bo‘ladi, belgilar massiviga aylantirish uchun qatorning alohida belgilarini ajratib olishni bilish ham zarur.
Yechish
Shakl
Mazkur masalaning shakli Edit1 maydoniga kiritilgan belgilar kodlarini chiqarish uchun bitta Memo maydoniga ega. Edit1 maydonining yonida uni ko‘rsatuvchi Label1 maydoni joylashgan bo‘ladi.
Almashtirishni tavsiflash
«belgi» = «uning kodi» turidagi qatorni shakllantirish uchun qatorning «+» buyrug‘i bilan o‘zaro ta’sir etish xossasidan foydalaniladi. Buning uchun belgi h qatorga almashtiriladi.
AnsiString h = c[i];
Undan so‘ng q qator hosil qilinadi va Memo1 komponentining boshqa qatorlariga qo‘shiladi.
AnsiString q = h + " q " + IntToStr(*((byte*)(c+i)));
Memo1->Lines->Add(q);
Belgining kodini bevosita hisoblovchi dastur kodini ko‘rib chiqamiz:
IntToStr(*((byte*)(c+i)));
Bu yerda (c+i) - massivning i-nomerli elementiga ko‘rsatkichdir. (byte*)(c+i) - bu ko‘rsatkichni byte turidagi butun qiymatli o‘zgaruvchi ko‘rsatkichi belgisiga almashtiradi. *((byte*)(c+i)) – bu o‘zgaruvchining byte turidagi bevosita qiymati. IntToStr(…) – sonli o‘zgaruvchini qatorga almashtiruvchi, bizga tanish bo‘lgan funksiya.
Izoh: Bu fragmentda belgining ko‘rsatkichini butun qiymatli o‘zgaruvchining ko‘rsatkichiga almashtirish ortiqcha ish edi, chunki C++ bunday almashtirishni turlarni almashtirishni to‘g‘ridan-to‘g‘ri ko‘rsatmasdan ham bajara oladi, ammo oshkor almashtirish dastur kodining ko‘rsatmaliligini oshirish maqsadida ishlatilgan.