Студопедия
Новини освіти і науки:
МАРК РЕГНЕРУС ДОСЛІДЖЕННЯ: Наскільки відрізняються діти, які виросли в одностатевих союзах


РЕЗОЛЮЦІЯ: Громадського обговорення навчальної програми статевого виховання


ЧОМУ ФОНД ОЛЕНИ ПІНЧУК І МОЗ УКРАЇНИ ПРОПАГУЮТЬ "СЕКСУАЛЬНІ УРОКИ"


ЕКЗИСТЕНЦІЙНО-ПСИХОЛОГІЧНІ ОСНОВИ ПОРУШЕННЯ СТАТЕВОЇ ІДЕНТИЧНОСТІ ПІДЛІТКІВ


Батьківський, громадянський рух в Україні закликає МОН зупинити тотальну сексуалізацію дітей і підлітків


Відкрите звернення Міністру освіти й науки України - Гриневич Лілії Михайлівні


Представництво українського жіноцтва в ООН: низький рівень культури спілкування в соціальних мережах


Гендерна антидискримінаційна експертиза може зробити нас моральними рабами


ЛІВИЙ МАРКСИЗМ У НОВИХ ПІДРУЧНИКАХ ДЛЯ ШКОЛЯРІВ


ВІДКРИТА ЗАЯВА на підтримку позиції Ганни Турчинової та права кожної людини на свободу думки, світогляду та вираження поглядів



Бітові поля

Використання структур у функціях

Найчастіше в тіло функції необхідно передати інформацію, структуровану по визначеному принципу. При цьому як параметр у прототипі функції вказується користувацький тип даних, сформований при оголошенні структури. Так, якщо була оголошена структура

struct ALLNUMB

{

int nVar,

long LVar;

short shVar;

unsigned int uiVar;

};

прототип функції буде, наприклад, мати вигляд:

void Func(ALLNUMB);

При цьому відбувається передача в тіло функції параметра типу структури за значенням. Таким чином, оригінал структурованого об’єкта модифікації не підлягає. Функція може також повертати об’єкт типу структури:

ALLNUMB Func2(ALLNUMB);

У цьому випадку модифіковані дані при виході з функції не втратяться, а будуть передані у виклик функції.

Розглянемо приклад передачі у функцію описаної раніше структури House для виведення на екран назви вулиці і номери будинку, що міститься в ній.

#include <iostream.h>

#include <string.h>

struct HOUSE

{

unsigned short RegNum;

char Street[51]; // з ‘\0’

char HouseNum[6];

unsigned short MaxFloorNum;

unsigned short MaxFlatNum;

bool Parking;

};

void OutAddress(HOUSE);

int main()

HOUSE MyHouse;

MyHouse.RegNum = 524;

strcpy(MyHouse.Street, "вул. Гоголя");

strcpy(MyHouse.HouseNum, "2-a");

MyHouse.MaxFloorNum = 7;

MyHouse.MaxFlatNum = 84;

MyHouse.Parking = true;

OutAddress(MyHouse);

return 0;

}

void OutAddress(HOUSE house)

{

cout <<house.Street <<", ";

cout <<house.HouseNum « ‘\n’;

}

Виклик функції OutAddress (MyHouse) передає в тіло сформовану структуру, доступ до членів якої здійснюється відповідно до описаного вище правила, через символ крапка (.). У результаті на екран буде виведено:

вул. Гоголя, 2-а

Для визначення розміру структурованого об’єкта в пам’яті до нього застосовують оператор (або функцію) sizeof. Таким чином, окремий екземпляр структури House буде займати, наприклад, 64 байта:

int i = sizeof(HOUSE);

Однак дуже часто структури допомагають заощаджувати пам’ять завдяки використанню так званих бітових полів. У цьому випадку оголошення поля структури має вигляд:

оголошення_поля : константний вираз;

де

оголошення__поля - оголошення типу й імені поля структури:

константний__вираз визначає довжину поля в бітах.Тип поля повинен бути цілочисельним (int, long, unsigned, char). Оголошення_поля може бути відсутнім. У цьому випадку в шаблоні структури пропускається зазначене після двокрапки число бітів. Таким чином, якщо Розробник знає напевно, що елемент структури може приймати, скажемо, всього два значення (0 або 1), для нього можна відвести один біт. Реалізація бітових полів тісно зв’язана з апаратною платформою, на якій функціонує компілятор. Тому деталі використання бітових полів слід уточнити в документації, що поставляється з вашим компілятором.

Розглянемо невеликий приклад. Припустимо, необхідно створити структуру, що містить інформацію про дату і час деяких подій. Цього можна домогтися наступним шляхом:

struct DATETIME

{

unsigned short Year; // рік

unsigned short Month; // місяць

unsigned short Date; // дата

unsigned short Hour; // години

unsigned short Minute; // хвилини

unsigned short Second; // секунди

};

Таким чином, об’єкт типу DATETIME у пам’яті буде займати б(елементів) х 2(байти) = 12 байт. Неважко помітити, що в описі такої структури присутня значна надмірність тому що рік може приймати значення від 0 до 99 (задіюється всього 7 біт), місяць - від 1 до 12 (4 біта), дата - від 1 до 31 (5 біт), годинник, хвилини і секунди - від 0 до 59 (по 6 біт на кожний елемент). Застосовуючи бітові структури, наведена вище структура набуде вигляду:

struct DATETIME2

{

unsigned Year: 7; // рік

unsigned Month: 4; // місяць

unsigned Date: 5; // дата

unsigned Hour: 6; // години

unsigned Minute: 6; //хвилини

unsigned Second: 6; // секунди

};

Экземпляр модифікованого типу DATETIME2 буде займати не 64, а 5 байт (тому що 34 біта можуть бути розміщені тільки в п’ятьох байтах).




Переглядів: 887

<== попередня сторінка | наступна сторінка ==>
Поняття радіоактивності | Контрольні запитання

Не знайшли потрібну інформацію? Скористайтесь пошуком google:

  

© studopedia.com.ua При використанні або копіюванні матеріалів пряме посилання на сайт обов'язкове.


Генерація сторінки за: 0.004 сек.