Структуралар ва функциялар. Структуралар функциялар аргументлари сифатида ёки функция қайтарувчи қиймат келиши мумкин. Бундан ташқари иккала холда хам структурага кўрсаткичлардан фойдаланиш мумкиндир.
Мисол учун комплекс сон модулини хисоблаш дастурини келтирамиз:
Double modul(complex a)
{return sqrt(a.real*a.real+a.imag*a.imag}
Икки комплекс сон йиғиндисини хисоблаш функцияси:
complex add(complex a, complex b)
{ complex c;
c.real=a.real+b.real;
c.imag=a.imag+b.imag;
return c;
}
Структуралар учун хотирадан жой ажратиш. Структура учун ажратилган жой хажмини қуйидаги амаллар ёрдамида аниқлаш мумкин:
Sizeof (структурали_тип_номи);
Sizeof (структура_номи);
Sizeof структура_номи.
Охирги холда структура номи ифода деб каралади. Ифоданинг типи аниқланиб, хажми хисобланади.
Мисол учун:
Sizeof (struct goods)
Sizeof (tea)
Sizeof coat
Мураккаб типлар яъни массивлар ва структурали типлар учун хотирага талаб уларнинг таърифига боғлиқдир. Масалан double array[10] таъриф хотирадан 10*sizeof байт жой ажратилишига олиб келади.
Struct mixture
{
int ii;
long ll;
char cc[8];
};
Бу таъриф хар бир Struct mixture типидаги объект хотирада sizeof(int)+sizeof(long)+8*sizeof(char) байт жой эгаллашини кўрсатади. Объъект аниқ хажмини қуйидаги амал хисоблайди:
Sizeof(struct mixture)
Хотирани текислаш. Структурали тип киритилиши бу тип учун хотирадан жой ажратилишига олиб келмайди. Хар бир конкрет структура (объект) таърифланганда, шу объект учун элементлар типларига қараб хотирадан жой ажратилади. Хотирадан жой зич ажратилганда структура учун ажратилган жой хажми хар бир элемент учун зарур бўлган хотира хажмлари йигиндисига тенг бўлади. Шу билан бирга хотирадан жой зич ажратилмаслиги хам мумкин яъни элементлар орасида бўш жойлар хам колиши мумкин. Бу бўш жой кейинги элементни хотира кисмларининг кабул қилинган чегаралари бўйича текислаш учун колдирилади. Мисол учун бутун типдаги элементлар жуфт адреслардан бошланса, бу элементларга мурожаат тезроқ амалга оширилади.
#include
using namespace std;
struct Foo
{
char c;
int i;
char s;
};
int main ()
{
cout<<"Foo hajmi="<return 0;
}
Натижа:
Foo hajmi=12
Конкрет структураларни жойлашувига баъзи компиляторларда #pragma препроцессор директиваси ёрдамида таъсир ўтказиш мумкин. Бу директива қуйидаги шаклда:
Pragma pack(n)
Бу ерда n қиймати 1,2 ёки 4 га тенг бўлиши мумкин.
Pack(1) – элементларни байт чегаралари бўйича текислаш;
Pack(2) – элементларни сўзлар чегаралари бўйича текислаш;
Pack(4) – элементларни иккиланган сўзлар чегаралари бўйича
Масалан
#include
#pragma pack(1)
using namespace std;
struct Foo
{
char c;
int i;
char s;
};
int main ()
{
cout<<"Foo hajmi="<return 0;
}
Натижа:
Foo hajmi=6
Do'stlaringiz bilan baham: |