10.1: Вступ
- Page ID
- 29626
C дозволяє складні дані, які називаються структурами, або коротко структурувати. Ідея полягає у використанні різноманітних основних типів даних, таких як float або int для опису якогось об'єкта. Структури можуть містити кілька кожного типу разом з покажчиками, масивами і навіть іншими структурами. Існує багато застосувань для такої конструкції, і структури дуже поширені в виробничому коді C.
Як приклад ми можемо описати такий електронний компонент, як транзистор. Які речі нам потрібні? Існує кілька параметрів продуктивності, які можуть бути використані, такі як посилення струму, напруга пробою і максимальна розсіювання потужності. Всі ці елементи можуть бути представлені у вигляді подвійних змінних. Там буде номер моделі. Ймовірно, це буде рядок, оскільки він може містити літери (наприклад, «2N3904»). Там повинен бути код виробника. Це може бути Int. Реальний пристрій матиме набагато більше параметрів, ніж ці п'ять, але і цих буде достатньо для наших цілей. Якщо у вас є тільки один транзистор, щоб мати справу з, п'ять окремих змінних не є великою справою, щоб відстежувати. З іншого боку, що робити, якщо у вас є велика кількість частин, як у базі даних? Можливо, є 1000 пристроїв. Створення 5000 окремих змінних і збереження їх прямо представляє трохи виклик. Було б непогано, якби ми могли об'єднати п'ять елементів разом у «супер змінну». Тоді все, що нам потрібно турбуватися про створення 1000 з них для бази даних (можливо, з масивом, хоча є й інші методи). Там не повинно бути проблеми з отриманням поточного посилення одного пристрою плутати з іншим. Саме тут входять структури. Нижче наведено приклад того, як ми б визначали цю транзисторну структуру та пов'язані з ними екземпляри.
struct transistor {
double currentgain;
double breakdown;
double maxpower;
short int manufacturer;
char model[20];
};
struct transistor my_transistor;
struct transistor *ptransistor;
Ми визначили структуру типу транзистора. Ми також оголосили екземпляр транзистора структури називається my_tsistor, поряд з покажчиком на транзистор структури називається ptrisor. П'ять елементів називаються полями структури (наприклад, currentgain field). Зауважте, що ця структура містить масив символів для назви/номера моделі. Модель не може перевищувати 19 символів (19 плюс кінцевий нуль дає 20 оголошених). Навряд чи ми коли-небудь матимемо назву/номер моделі так довго, але якщо випадково ми це зробимо, нам доведеться його обрізати.
Щоб встановити або отримати значення з екземпляра, ми використовуємо крапку, щоб відокремити ім'я структури від поля інтересу. Ось кілька прикладів:
my_transistor.currentgain = 200.0; my_transistor.maxpower = 50.0; my_transistor.manufacturer = 23;
В останньому призначенні може бути краще використовувати #define, а не жорстке число. Наприклад, помістіть наступне визначення у файлі заголовка, а потім скористайтеся наведеним нижче призначенням:
#define MOTOROLA 23 my_transistor.manufacturer = MOTOROLA;
Щоб встановити поле моделі, ви можете зробити щось подібне:
strcpy( my_transistor.model, “2N3904” );
Пам'ятайте, strcpy () потребує адрес. Літерал рядка з подвійними лапками створює це автоматично. Для поля моделі використовуємо ярлик, описаний в попередній роботі. Рядок вище еквівалентний:
strcpy( &(my_transistor.model[0]), “2N3904” );
Якщо вам потрібно використовувати поле в обчисленні або порівнянні, доступ незмінний:
if( my_transistor.breakdown > 75.0 )
printf(“Breakdown voltage is at least 75 volts!\n”);
Хорошим питанням на даний момент є те, чи не оголошений порядок полів робить якусь різницю. Це залежить від компілятора і цільового обладнання. У деяких процесорах багатобайтові змінні, такі як довгі та короткі цілі числа, поплавці та покажчики, повинні бути вирівняні по словах. Наприклад, короткий int може знадобитися для запуску на парну адресу або поплавок може знадобитися для початку на адресу, ділену на чотири. У такій системі структура, оголошена з порядком char, float, char, int буде потрібно pad байт між деякими полями, щоб забезпечити вирівнювання і займе більше місця в пам'яті, ніж якби структура була організована як float, int, char, char. Це має особливе значення, якщо будуть використовуватися великі масиви конструкцій.
