Оголошення змінних в мові програмування C-51*.
У мові програмування C51 будь-яка змінна повинна бути оголошена до першого використання цієї змінної. Як вже мовилося раніше, ця мова програмування призначена для написання програм для мікроконтролерів сімейства MCS-51, тому у складі мови повинна відображатися внутрішня структура цього сімейства мікроконтролерів. Ці особливості відображені у введенні нових типів даних. У іншому мова програмування C-51 не відрізняється від стандарту ANSI.
Оголошення змінній в мові програмування C51 представляється в наступному вигляді:
[спецификатор класса памяти] спецификатор типа [спецификатор типа памяти] описатель [=инициатор] [,описатель [= инициатор] ]...
Описувач - ідентифікатор простій змінній або складніша конструкція з квадратними дужками, круглими дужками або зірочкою (набором зірочок).
Специфікатор типу - одне або декілька ключових слів, що визначають тип оголошуваної змінної. У мові СІ є стандартний набір типів даних, використовуючи який можна сконструювати нові (унікальні) типи даних.
Ініціатор - задає початкове значення або список початкових значень, які (яке) привласнюється змінною при оголошенні.
Специфікатор класу пам'яті - визначається одним з чотирьох ключових слів мови З: auto, extern, register, static, і указує, яким чином розподілятиметься пам'ять під оголошувану змінну, з одного боку, а з іншою, область видимості цієї змінної, тобто, з яких частин програми можна до неї звернутися.
Специфікатор типу пам'яті - визначається одним з шести ключових слів мови С-51: code, data, idata, bdata, xdata, pdata і указує, в якій області памяти микроконтроллера буде розміщена змінна.
Категорії типів даних
Ключові слова для визначення основних типів даних
Целые типы данных: Типы данных с плавающей запятой: bit float sbit char int short long signed unsigned sfr sfr16Змінна будь-якого типу може бути оголошена як незмінна. Це досягається додаванням ключового слова const до специфікатора типу. Об'єкти з типом const є даними, використовуваними тільки для читання, тобто цій змінній не може бути привласнене нове значення. Відзначимо, що якщо після слова const відсутній специфікатор типу, то подразумеваєтся специфікатор типу int. Якщо ключове слово const стоїть перед оголошенням складених типів (масив, структура, суміш, перерахування), то це призводить до того, що кожен елемент також повинен бути таким, що не модифікується, тобто значення йому може бути привласнене тільки один раз.
Приклади використання ключового слова const:
const float A=2.128E-2; const B=286; //подразумевается const int B=286Відзначимо, що змінні із специфікатором класу пам'яті розміщуються у внутрішньому ОЗУ. Незмінність контролюється тільки на етапі трансляції. Для розміщення змінної в ПЗП краще скористатися специфікатором типу пам'яті code
Цілі типи даних
Для визначення даних цілого типу використовуються різні ключові слова, які визначають діапазон значень і розмір області пам'яті, що виділяється під змінні (табл. 6).
Таблица 6
Тип | Размер памяти в битах | Размер памяти в байтах | Диапазон значений |
bit | от 0 до 1 | ||
char | от -128 до 127 | ||
unsigned shar | oт 0 до 255 | ||
int, short | от -32768 до 32767 | ||
long | от -2 147 483 648 до 2 147 483 647 | ||
unsigned int, unsigned short | от 0 до 65535 | ||
unsigned long | от 0 до 4 294 967 295 | ||
sbit | 0 или 1 | ||
sfr | oт 0 до 255 | ||
sfr16 | от 0 до 65535 |
Відзначимо, що ключові слова signed і unsigned необов'язкові. Вони указують, як інтерпретується нульовий біт оголошуваної змінної, тобто, якщо вказано ключове слово unsigned, то нульовий біт інтерпретується як частина числа, інакше нульовий біт інтерпретується як знаковий. У разі відсутності ключового слова unsigned ціла змінна вважається знаковою. В тому випадку, якщо специфікатор типу складається з ключового типу signed або unsigned і далі слідує ідентифікатор змінної, то вона розглядатиметься як змінна типу int. Наприклад:
unsigned int n; //Беззнаковое шестнадцатиразрядное число nunsigned int b;int c; //подразумевается signed int cunsigned d; //подразумевается unsigned int dsigned f; //подразумевается signed int fВідзначимо, що модифікатор типу char використовується для представлення одиночного символу або для оголошення рядкових літералів. Значенням об'єкту типу char є код (розміром 1 байт), відповідний символу, що представляється.
Відзначимо також, що восьмерічниє і шестнадцатерічниє константи також можуть мати модифікатор unsigned. Це досягається вказівкою суфікса u або U після константи, константа без цього префікса вважається знаковою.
Наприклад:
0xA8C //int signed01786l //long signed0xF7u //int unsignedЧисла з плаваючою комою
Для змінних, що представляють число с плавающей запятой використовується модифікатор типу float. Модифікатор double теж допустимий в мові програмування C51, але вона не приводить до збільшення точності результату.
Величина з модифікатором типу float займає 4 байти. З них 1 байт відводиться для знаку, 8 битий для надмірної експоненти і 23 бита для мантиси. Відзначимо, що старший біт мантиси завжди рівний 1, тому він не заповнюється, у зв'язку з цим діапазон значень змінної з плаваючою крапкою рівний від ±1.175494E-38 до ±3.402823E+38.
Приклад оголошення змінній з плаваючою комою:
float f, a, b;Змінні типу, що перераховує
Змінна, яка може приймати значення з деякого списку значень, називається змінною типу, що перераховує, або перерахуванням.
Використання такого вигляду змінною еквівалентне застосуванню цілої знакової змінної char або int. Це означає, що для змінній вигляду, що перераховує, буде виділено один або два байти залежно від максимального значення використовуваних цією змінною констант. На відміну від змінних цілого типу, змінні типу, що перераховує, дозволяють замість безликих чисел використовувати імена констант, які зрозуміліші і легше запам'ятовуються людиною.
Наприклад, замість використання чисел 1,2,3,4,5,6,7 можна використовувати назви днів тижня: Poned, Vtorn, Sreda, Chetv, Pjatn, Subb, Voskr. При цьому кожній константі відповідатиме своє конкретне число. Проте використання імен констант приведе до зрозумілішої програми. Більш того, транслятор сам дозволяє відстежувати правильність використання констант і при спробі використання константи, що не входить в оголошений наперед список, видає повідомлення про помилку.
Змінні enum типу можуть використовуватися в індексних виразах і як операнди в арифметичних операціях і в операціях відношення. Наприклад:
if(rab_ned == SUB) dejstvie = rabota [rab_ned];
При оголошенні перерахування визначається тип змінної перерахування і визначається список іменованих констант, званий списком перерахування. Значенням кожного імені цього списку є ціле число. Оголошення змінній, що перераховує, починається з ключового слова enum і може бути представлене в двох форматах:
1. enum [имя типа перечисления] {список констант} имя1 [,имя2 ...];
2. enum имя перечисления описатель [,описатель..];
У першому форматі імена і значення констант задаються в списку констант. Необов'язкове ім'я типу оголошуваної змінної - це ідентифікатор, який є типом змінної, відповідним списку констант. За списком констант записується ім'я одній або декілька змінних.
Список констант містить одну або декілька конструкцій вигляду:
ідентифікатор [= константний вираз]
Кожен ідентифікатор - це ім'я константи. Всі ідентифікатори в списку enum повинні бути унікальними. У випадку якщо константі явним чином не задається число, то першому ідентифікатору привласнюється значення 0, наступному ідентифікатору - значення 1 і т.д.
Приклад оголошення змінній rab_ned і типу змінних, сумісних з цією змінною, week виглядає таким чином:
enum week {SUB = 0, /* константе SUB присвоено значение 0 */ VOS = 0, /* константе VOS присвоено значение 0 */ POND, /* константе POND присвоено значение 1 */ VTOR, /* константе VTOR присвоено значение 2 */ SRED, /* константе SRED присвоено значение 3 */ HETV, /* константе HETV присвоено значение 4 */ PJAT /* константе PJAT присвоено значение 5 */ } rab_ned;Ідентифікатор, пов'язаний з константним виразом, приймає значення, що задається цим константним виразом. Результат обчислення константного виразу повинен мати тип int і може бути як позитивним, так і негативним. Наступному ідентифікатору в списку, якщо цей ідентифікатор не має свого константного виразу, привласнюється значення, рівне константному виразу попереднього ідентифікатора плюс 1. Використання констант повинне підкорятися наступним правилам:
1. Оголошувана змінна може містити значення констант, що повторюються.
2. Ідентифікатори в списку констант повинні бути відмінні від всіх інших ідентифікаторів в тій же області видимості, включаючи імена звичайних змінних і ідентифікатори з інших списків констант.
3. Імена типів перерахувань повинні бути відмінні від інших імен типів перерахувань, структур і сумішей в цій же області видимості.
4. Значення може слідувати за останнім елементом списку перерахування.
У другому форматі для оголошення змінній типу, що перераховує, використовується вже готовий тип змінної вже оголошений раніше. Наприклад:
enum week rab1;
До змінній типу, що перераховує, можна звертатися за допомогою покажчиків. При цьому необхідно наперед визначити тип змінної, на яку посилатиметься покажчик. Це може бути зроблено, як описувалося вищим або за допомогою оператора typedef. Наприклад:
Typedef enum {SUB = 0, /* константе SUB присвоено значение 0 */ VOS = 0, /* константе VOS присвоено значение 0 */ POND, /* константе POND присвоено значение 1 */ VTOR, /* константе VTOR присвоено значение 2 */ SRED, /* константе SRED присвоено значение 3 */ HETV, /* константе HETV присвоено значение 4 */ PJAT /* константе PJAT присвоено значение 5 */ } week;Цей оператор не оголошує змінну, а тільки визначає тип змінної, що відрізняється від стандартного. Надалі цей тип може бути використаний для оголошення змінних і покажчиків на змінні.
Дата добавления: 2017-01-29; просмотров: 670;