C Birlashmalar

Strukturalarga yaqin tushuncha bu birlashma tushunchasidir. Birlashmalar union xizmatchi so’zi yordamida kiritiladi. Misol uchun:

union 
{
      long h; 
      int i,j; 
      char c[4]
}
UNI;

Birlashmalarning asosiy xususiyati shundaki, uning hamma elementlari bir xil boshlang’ich adresga ega bo’ladi. Birlashmalarning asosiy afzalliklaridan biri xotira biror qismi qiymatini har xil turdagi qiymat shaklida qarash mumkindir.Misol uchun quyidagicha birlashma:

union 
{
      float f; 
      unsigned long k; 
      char h[4];
} 
fl;

Xotiraga fl.f = 2.718 haqiqiy son yuborsak uning ichki ko’rinishi kodini fl.l yordamida ko’rishimiz yoki alohida baytlardagi qiymatlarni fl.h[0]; fl.h[1] va hokazo yordamida ko’rishimiz mumkin. Quyidagi dastur yordamida birlashma xususiyatini tekshirish mumkin:

#include  <stdio.h>
enum paytype{CARD, CHECK};
struct
{
    enum paytype ptype;
    union
    {
        char card[4];
        long check;
    };
}
info;
int main() 
{
    info.ptype = CHECK;
    info.check = 77;
    switch (info.ptype)
{
    case CARD:printf("\nKarta bilan to'lash:%s", info.card); break;
    case CHECK:printf("\nChek bilan to'lash:%ld", info.check); break;
}
return 0;
}

Natija:

Chek bilan to'lash:77

Birlashmalar imkoniyatlarini ko’rsatish uchun bioskey() funksiyasidan foydalanishni ko’rib chiqamiz. Bu funksiya bios.h sarlavhali faylda joylashgan bo’lib, quyidagi prototipga ega: int bioskey(int); MS DOS operasion tizimida ixtiyoriy klavishaning bosilishi klaviatura buferiga ma’lumot yozilishiga olib keladi. Agar funksiyaga bioskey(0) shaklda murojaat qilinsa va bufer bo’sh bo’lsa biror klavishaga bosilishi kutiladi, agar bufer bo’sh bo’lmasa funksiya buferdan ikki baytli kodni o’qib butun son sifatida qaytaradi. Funksiyaga bioskey(0) shaklda murojaat qilinsa va bufer bo’sh bo’lsa biror klavisha bosilishi kutiladi, agar bufer bo’sh bo’lmasa funksiya buferdagi navbatdagi kodni qaytaradi. Funksiyaga bioskey(1) shaklda murojaat qilish bufer bo’sh yoki bo’shmasligini aniqlashga imkon beradi. Agar bufer bo’sh bo’lmasa funksiya buferdagi navbatdagi kodni qaytaradi, lekin bu kod buferdan o’chirilmaydi. Quyidagi dastur buferga kelib tushuvchi kodlarni o’qib monitorga chiqarishga imkon beradi:

#include <stdio.h>
#include <bios.h>
int main()
{
    union
    {
        char hh[2];
        int ii;
    }
    cc;
    unsigned char scn,asc;
    printf("\n\n Ctrl+Z bilan chikish.");
    printf("\n Klavishani bosib, kodini oling. \n ");
    printf("\n SCAN || ASCII");
    printf("\n (10) (16) (10) (16)");
    do
    {
        printf("\n");
        cc.ii = bioskey(0);
        asc = cc.hh[0];
        scn = cc.hh[1];
        printf(" %4d %3xH || %4d %3xH |", scn, scn, asc, asc);
    }
    while(asc! = 26 || scn! = 44);
    return 0;
}

Bu dasturda cc nomli birlashma kiritilgan bo’lib, cc.ii elementiga bioskey(0) funksiyasi natijasi yoziladi. So’ngra natijaning alohida baytlari sken va ASCII kodlar sifatida monitorga chiqariladi.Sikl to 256 ASCII kod va 44 sken kod paydo bo’lmaguncha (ctrl+Z klavishlari bosilmaguncha) davom etadi. Razryadli maydonlar. Razryadli maydonlar strukturalar va birlashmalar maydonlarining xususiy xolidir. Razryadli maydon ta’riflanganda uning uzunligi bitlarda ko’rsatiladi (butun musbat konstanta).

Misol:

#include <stdio.h>
struct 
{
    int a:8;
    int b:6;
} 
xx = {64, 64};
int main() 
{
    printf("\n%d", xx.a);
    printf("\n%d", xx.b);
    return 0;
}

Natija:

64
0

Razryadli maydonlar ixtiyoriy butun turga tegishli bo’lishi mumkin. Razryadli maydonlar adresini olish mumkin emas. Xotirada razryadli maydonlarni joylashtirish kompilyator va apparaturaga bog’liq. Razryadli maydonlar yordamida razryadli massivlar hosil qilish mumkin. Yuqorida ko’rilgan son hamma bitlarini chiqarish dasturini quyidagicha yozish mumkin:

#include<stdio.h>
#include<conio.h>
struct bit
{
    unsigned int i:1;
}
unsigned printbits(int c, struct bit pp[])
{
    unsigned int i;
    unsigned k = 8*sizeof(int);
    for(i = 0; i < k; i++)
    {
        pp[i].i = c&1;
        printf(" %d", c&1);
        c>> = 1;
    }
    return k;
}
int main()
{
    unsigned int k, i;
    struct bit pp[100];
    k = printbits(-5, pp);
    printf("\n");
    for(i = k-1; i > 0; i--)
    printf("%d ", pp[i].i);
    printf("%d ", pp[0].i);
    getch();
    return 0;
}