C Struktura xossalari

Strukturalar va funksiyalar. Strukturalar funksiyalar argumentlari sifatida yoki funksiya qaytaruvchi qiymat sifatida kelishi mumkin. Bundan tashqari funksiya argumenti sifatida struktura turidagi massiv kelishi mumkin. Misol uchun kompleks son modulini hisoblash dasturini keltiramiz:

double modul(complex a)
{
      return sqrt(a.real*a.real+a.imag*a.imag
}

Ikki kompleks son yig’indisini hisoblash funksiyasi:

complex add(complex a, complex b)
{ 
      complex c;
      c.real = a.real+b.real;
      c.imag = a.imag+b.imag;
      return c;
}

Misol:

#include<stdio.h>
#include<conio.h>
typedef struct
{
    char name[20];
    int year;
} 
person;
person old_person(person a[], int n)
{
    int i;
    person s = a[0];
    for(i = 1; i < n; i++)
    if(a[i].year > s.year) s = a[i];
    return s;
}
void print_person(person s)
{
    printf("name %s\n", s.name);
    printf("year %d", s.year);
}
int main()
{
    person a[] = {{"smit", 34}, {"bobbi", 45}, {"pit", 56}};
    person s = old_person(a, 3);
    print_person(s);
    getch();
    return 0;
}

Funksiyada bitta struktura turidagi o’zgaruvchi qiymatini o’zgartirish mumkin emas, lekin massiv elementlari qiymatini o’zgartirish mumkin:

#include<stdio.h>
#include<conio.h>
struct goods 
{
    char name[20];
    long price;
    float percent;
}
void change_percent(struct goods a[], int n, float percent)
{
    int i;
    for(i = 1;i <n; i++) 
    a[i].percent = percent;
}
void print_goods (struct goods s)
{
    printf("%s %ld %f\n", s.name, s.price, s.percent);
}
void all_print (struct goods a[], int n)
{
    int i;
    for(i = 0;i < n; i++) 
    print_goods(a[i]);
}
int main()
{
    struct goods a[] = {{"smit", 34, 0.5},{"bobbi", 45, 0.7},{"pit", 56, 0.8}};
    all_print(a, 3);
    change_percent(a, 3, 0.5);
    all_print(a, 3);
    getch();
    return 0;
}

Strukturalar uchun xotiradan joy ajratish. Struktura uchun ajratilgan joy hajmini quyidagi amallar yordamida aniqlash mumkin:

sizeof (strukturali_tur_nomi);
sizeof (struktura_nomi);
sizeof struktura_nomi.

Oxirgi holda struktura nomi ifoda deb qaraladi. Ifodaning turi aniqlanib, hajmi hisoblanadi.

Misol uchun:

sizeof ( struct goods )
sizeof ( tea )
sizeof coat

Murakkab turlar ya’ni massivlar va strukturali turlar uchun xotiraga talab ularning ta’rifiga bog’liqdir. Masalan, double array[10] ta’rif xotiradan 10*sizeof bayt joy ajratilishiga olib keladi.

struct mixture
{ 
    int ii;
    long ll;
    char cc[8];
}

Bu ta’rif har bir struct mixture turidagi obyekt xotirada sizeof(int)+sizeof(long)+8*sizeof(char) bayt joy egallashini ko’rsatadi. Obekt aniq hajmini quyidagi amal hisoblaydi: sizeof(struct mixture) Xotirani tekislash. Strukturali tur kiritilishi bu tur uchun xotiradan joy ajratilishiga olib kelmaydi. Har bir konkret struktura (obyekt) ta’riflanganda, shu obyekt uchun elementlar turlariga qarab xotiradan joy ajratiladi. Xotiradan joy zich ajratilganda struktura uchun ajratilgan joy hajmi har bir element uchun zarur bo’lgan xotira hajmlari yig’indisiga teng bo’ladi. Shu bilan birga xotiradan joy zich ajratilmasligi ham mumkin, ya’ni elementlar orasida bo’sh joylar ham qolishi mumkin. Bu bo’sh joy keyingi elementni xotira qismlarining qabul qilingan chegaralari bo’yicha tekislash uchun qoldiriladi. Misol uchun butun turdagi elementlar juft adreslardan boshlansa, bu elementlarga murojaat tezroq amalga oshiriladi. 

#include <stdio.h>
struct Fon
{
    char c;
    int i;
    char s;
}
int main() 
{ 
    printf("Fon hajmi = %d",sizeof(Fon));
    return 0;
}

Natija:

Fon hajmi = 12

Konkret strukturalarni joylashuviga ba’zi kompilyatorlarda #pragma preprosessor direktivasi yordamida ta’sir o’tkazish mumkin. Bu direktiva quyidagi shaklda:

pragma pack(n)

Bu yerda n ning qiymati 1, 2 yoki 4 ga teng bo’lishi mumkin.

Masalan:

  • pack(1) – elementlarni bayt chegaralari bo’yicha tekislash; 
  • pack(2) – elementlarni so’zlar chegaralari bo’yicha tekislash; 
  • pack(4) – elementlarni ikkilangan so’zlar chegaralari bo’yicha tekislash;
#include <stdio.h>
#pragma pack(1)
struct Fon
{
    char c;
    int i;
    char s;
}
int main() 
{ 
    printf("Fon hajmi = %d",sizeof(Fon));
    return 0;
}
Foo hajmi = 6