Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
lect6.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
344 Кб
Скачать
☆

Оголошення масивів в мові програмування c-51

Масиви - це група елементів однакового типу (float, char, int і т.п.). З оголошення масиву компілятор повинен отримати інформацію про тип елементів масиву і їх кількість. Оголошення масиву має два формати:

специфікатор-тіпа описувач [константний-вираз];

специфікатор-тіпа описувач [ ];

Описувач - це ідентифікатор масиву.

Специфікатор-тіпа задає тип елементів оголошуваного масиву. Елементами масиву не можуть бути функції і елементи типу void.

Константноє-вираженіє в квадратних дужках задає кількість елементів масиву. Константноє- вираз при оголошенні масиву може бути опущений в наступних випадках:

· при оголошенні масив ініціалізувався

· масив оголошений як формальний параметр функції

· масив оголошений як посилання на масив, явно визначений в іншому файлі.

У мові СІ визначені тільки одновимірні масиви, але оскільки елементом масиву може бути масив, можна визначити і багатовимірні масиви. Вони формалізуються списком константних-вираженій наступних за ідентифікатором масиву, причому кожне константноє-вираженіє полягає в свої квадратні дужки.

Кожне константноє-вираженіє в квадратних дужках визначає число елементів по даному вимірюванню масиву, так що оголошення двомірного масиву містить два константних-вираженія, тривимірного, - три і т.д. Відзначимо, що в мові СІ перший елемент масиву має індекс рівний 0.

Приклади:

int a[2][3]; /* представлено в виде матрицы

a[0][0] a[0][1] a[0][2]

a[1][0] a[1][1] a[1][2] */

double b[10]; /* вектор из 10 элементов имеющих тип double */

int w[3][3] = { { 2, 3, 4 },

{ 3, 4, 8 },

{ 1, 0, 9 } };

У останньому прикладі оголошений масив w[3][3]. Списки, виділені у фігурні дужки, відповідають рядкам масиву, у разі відсутності дужок ініціалізація буде виконана неправильно.

У мові СІ можна використовувати перетини масиву, як і в інших мовах високого рівня (PL1 і т.п. ), проте на використання перетинів накладається ряд обмежень. Перетини формуються унаслідок опускання однієї або декількох пар квадратних дужок. Пари квадратних дужок можна відкидати тільки справа наліво і строго послідовно. Перетини масивів використовуються при організації обчислювального процесу у функціях мови СІ, що розробляються користувачем.

Приклади:

int s[2][3];

Якщо при зверненні до деякої функції написати s[0], то передаватиметься нульовий рядок масиву s.

int b[2][3][4];

При зверненні до масиву b можна написати, наприклад, b[1][2] і передаватиметься вектор з чотирьох елементів, а звернення b[1] дасть двомірний масив розміром 3 на 4. Не можна написати b[2][4], подразумевая, що передаватися буде вектор, тому що це не відповідає обмеженню накладеному на використання перетинів масиву.

Для роботи з символьними рядками в мові програмування З використовуються масиви символів, наприклад:

char str[] = "объявление массива символов";

Слід враховувати, що в символьному рядку знаходиться на один елемент більше, оскільки останнім елементом рядка повинен бути '\0'. В даному прикладі використано неявне завдання довжини масиву символів. Це стало можливим оскільки масиву відразу привласнюється конкретне значення. При програмуванні мікроконтролерів сімейства MCS-51 таке завдання масиву може привести до невиправданої витрати внутренней памяти данных, тому краще скористатися розміщенням рядка в памяти программ:

char code str[] = "объявление массива символов";

Структури

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

Cтруктура - це складений об'єкт, в який входять елементи будь-яких типів, за винятком функцій. На відміну від масиву, який є однорідним об'єктом, структура може бути неоднорідною. Тип структури визначається записом вигляду:

struct { список описів}

У структурі обов'язково повинен бути вказаний хоч би один компонент. Компоненти структури називаються полями структури. Оголошення полів проводиться в наступному вигляді:

тіп-данних описувач;

де тіп-данних указує тип структури для об'єктів, визначуваних в описувачах. У простій формі описувачі є ідентифікаторами змінних або масивів.

Приклад оголошення структур:

struct//Описание типа структуры-------------------------

{char tzvet,//Цвет точки

int x, //Координата X

y; //Координата Y

}//------------------------------------------------------

tochka1, tochka2, //Переменные, обозначающие точки дисплея

simv[7][9]; //Переменная, содержащая рисунок символа

struct

{int year; //Поле структуры, в котором хранится год

char moth, //Поле структуры, в котором хранится месяц

day; //Поле структуры, в котором хранится день

}//-------------------------------------------------------

date1, date2;//Переменные, обозначающие две различных даты

Змінні tochka1, tochka2 оголошуються як структури, кожна з яких складається з трьох полий tzvet, х і у. Змінна simv оголошується як двовимірний масив, що складається з 63 змінних, що описують точку дисплея. У другому оголошенні кожна з двох змінних date1, date2 складається з трьох компонентів year, moth, day.

Існує і інший спосіб скріплення імені змінної з типом структури, він заснований на використанні окремого оголошення типу структури. Тип структури описується таким чином:

struct тіп-структури { список описів; };

де тіп-структури є ідентифікатором типу оголошуваної структури і може бути використаний для подальшого оголошення структур даного вигляду (тобто що містять такі самі поля) у формі:

struct тіп-структури спісок-ідентіфікаторов;

У приведеному нижче прикладі ідентифікатор student описується як тип структури:

struct student

{char name[25];//Имя и фамилия студента

int id, //Номер в журнале

age; //Возраст

char usp; //успеваемость

};

Пример:

struct student st1[23];//объявление массива переменных типа студент

Доступ до компонентів структури здійснюється за допомогою вказівки імені структури і наступного через крапку імені виділеного компоненту, наприклад:

st[1].name="Иванов";

st[1].id=2;

st[1].age=23;

Поля бітів

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

struct { unsigned идентификатор 1 : длина-поля 1;

unsigned идентификатор 2 : длина-поля 2; }

дліна-поля задається цілим виразом або константою. Ця константа визначає число бітів, відведене відповідному полю. Поле нульовою довгі позначає вирівнювання на межу наступного слова.

Приклад:

struct

{unsigned R: 1;//Флаг приёма байта

unsigned T: 1;//Флаг передачи байта

unsigned Cmd:5;//Поле команды

unsigned St: 1;//Поле статуса

} Cntr;

Структури бітових полів можуть містити і знакові компоненти. Такі компоненти автоматично розміщуються на відповідних границях слів, при цьому деякі біти слів можуть залишатися невикористаними.

Посилання на полі бітів виконуються точно так, як і компоненти загальних структур. Саме ж бітове поле розглядається як ціле число, максимальне значення якого визначається довжиною поля. Наприклад:

Cntr.Cmd=30;

Об'єднання (змішай)

Головною особливістю об'єднання є те, що для кожного з оголошених елементів цього об'єднання виділяється одна і та ж область пам'яті, тобто вони перекриваються. Хоча доступ до цієї області пам'яті можливий з використанням будь-якого з елементів, елемент для цієї мети повинен вибиратися так, щоб отриманий результат не був безглуздим.

Об'єднання застосовується для наступних цілей:

1. використання одного і тієї ж області пам'яті для розміщення змінних різного типу;

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

Об'єднання по опису подібно до структури. Тип об'єднання може задаватися в наступному вигляді:

union { описание элемента 1;

...

описание элемента n; };

Доступ до елементів об'єднання здійснюється тим же способом, що і до структур.

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

Другий варіант можна проілюструвати таким чином. Наприклад, потрібно передати число плаваючого типу. Проте послідовний порт може передавати або приймати тільки однобайтові числа. В цьому випадку можна скористатися об'єднанням:

union {float Koeff; //Интерпретация объединения как переменной плавающего типа

char byte[4];//Интерпретация объединения как массива

} bufer; //Объявление переменной bufer

Об'єднання bufer дозволяє послідовному порту дістати окремий доступ до всіх байтів числа bufer.Koeff починаючи від молодшого байта bufer.byte[0], і закінчуючи старшим байтом bufer.byte[3]. У програмі потім можна користуватися завантаженим числом як числом з плаваючою комою.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]