Александр Микушин - Занимательно о микроконтроллерах стр 64.

Шрифт
Фон

Например, требуется передать число плавающего типа. Однако последовательный порт может передавать или принимать только байты. В этом случае можно воспользоваться объединением:

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

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

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

Объединение bufer позволяет последовательному порту получить доступ к отдельным байтам числа bufer.Koeff, начиная от младшего байта bufer.byte[0] и заканчивая старшим байтом bufer.byte[3]. В программе затем можно пользоваться загруженным числом как числом с плавающей запятой.

Определение типов

Кроме определения переменных различных типов, имеется возможность заранее объявить тип переменной, а затем воспользоваться им при определении переменных. Использование при определении переменной заранее объявленного типа позволяет сократить определение, избежать ошибок при определении переменных в разных местах программы и добиться полной идентичности определяемых переменных.

Это можно сделать двумя способами. Первый способ - указать имя типа при объявлении структуры, объединения или перечисления, а затем использовать это имя в объявлении переменных и функций. Второй - использовать для объявления типа ключевое слово typedef. Следует отметить, что этот способ предпочтителен, т. к. использование его приводит к более наглядным и понятным программам.

При объявлении с ключевым словом typedef идентификатор, стоящий на месте описываемого объекта, является именем вводимого в рассмотрение типа данных, и далее этот тип может быть использован для объявления переменных.

Отметим, что любой тип может быть объявлен с использованием ключевого слова typedef, включая типы указателя, функции или массива. Имя с ключевым словом typedef для типов указателя, структуры, объединения может быть объявлено прежде, чем эти типы будут определены, но в пределах видимости объявителя.

Примеры объявления и использования новых типов:

Александр Микушин - Занимательно о микроконтроллерах

При объявлении переменных и типов здесь были использованы имена типов (MATH и FIO). Помимо определения переменных, имена типов могут еще использоваться в трех случаях: в списке формальных параметров при определении функций, в операциях приведения типов и в операции sizeof.

Инициализация данных

При объявлении переменной ей можно присвоить начальное значение, присоединяя инициатор к описателю. Инициатор начинается со знака "=" и имеет следующие формы.

'=' Инициатор';' (формат 1)

'=' '{' Список инициаторов '}'';' (формат 2)

Формат 1 используется при инициализации переменных основных типов и указателей, а формат 2 - при инициализации составных объектов.

Примеры:

char to1 = 'N';

Переменная to1 инициализируется символом 'N'.

const long megabute = (1024 * 1024);

Немодифицируемая переменная megabute инициализируется константным выражением, после чего эта переменная не может быть изменена.

static int b[2][2] = {1,2,3,4};

Инициализируется двухмерный массив b целочисленных величин, элементам массива присваиваются значения из списка. Эта же инициализация может быть выполнена следующим образом:

static int b[2][2] = { { 1,2 }, { 3,4 } };

При инициализации массива можно опустить одну или несколько размерностей

static int b[3][] = { { 1,2 }, { 3,4 } };

Если при инициализации указано меньше значений для строк, то оставшиеся элементы инициализируются 0, т. е. при описании

static int b[2][2] = { { 1,2 }, { 3 } };

элементы первой строки получат значения 1 и 2, а второй - 3 и 0.

При инициализации составных объектов нужно внимательно следить за использованием скобок и списков инициализаторов.

Примеры:

struct complex { float real;

float imag; } comp [2] [3] =

{ { {1,1}, {2,3}, {4,5} },

{ {6,7}, {8,9}, {10,11} } };

В данном примере инициализируется массив структур comp из двух строк.

Рассмотрим пример неправильной инициализации аналогичного массива. Ошибка связана с неправильным употреблением фигурных скобок.

struct complex comp2 [2][3] = { {1,1}, {2,3}, {4,5}, {6,7}, {8,9}, {10,11} };

В этом примере компилятор интерпретирует рассматриваемые фигурные скобки следующим образом:

- первая левая фигурная скобка - начало составного инициатора для массива соmр2;

- вторая левая фигурная скобка - начало инициализации первой строки массива соmр2 [0]. Значения 1, 1 присваиваются двум полям первой структуры;

- первая правая скобка (после 1) указывает компилятору, что список инициаторов для строки массива окончен, и элементы оставшихся структур в строке соmр2 [0] автоматически инициализируются нулем;

- аналогично список {2,3} инициализирует первую структуру в строке соmр2 [1], а оставшиеся структуры массива обращаются в нули;

- на следующий список инициализаторов {4,5} компилятор будет сообщать о возможной ошибке, т. к. строка 3 в массиве, соmр2 [2], отсутствует.

При инициализации объединения задается значение первого элемента объединения в соответствии с его типом.

Пример:

union tab { unsigned char name[10);

int tabl;

} pers = {'A', 'H', 'T', 'O', 'H'};

Инициализируется переменная pers.name, и т. к. это массив, для его инициализации требуется список значений в фигурных скобках. Первые пять элементов массива инициализируются значениями из списка, остальные - нулями.

Инициализацию массива символов можно выполнить, используя литеральную строку.

char stroka[] = "привет";

Инициализируется массив символов из 7 элементов, последним элементом (седьмым) будет символ '\0', которым завершаются все литеральные строки.

В том случае, если задается размер массива, а литеральная строка длиннее, чем размер массива, то лишние символы отбрасываются.

Следующее определение инициализирует переменную stroka литеральной строкой, состоящей из семи элементов.

char stroka[5] = "привет";

В переменную stroka попадают первые пять элементов литерала, а символы 'T' и '\0' отбрасываются.

Если строка короче, чем размер массива, то оставшиеся элементы массива заполняются нулями.

Отметим, что инициализация объединения типа tab может иметь следующий вид:

union tab pers1 = "Антон";

и, таким образом, в символьный массив попадут символы:

'А', 'н' 'т', 'о', 'н', '\0',

а остальные элементы будут инициализированы нулем.

Выражения

Выражением называется комбинация знаков операций и операндов, результатом которой является определенное значение. Знаки операций определяют действия, которые должны быть выполнены над операндами. Каждый операнд в выражении в свою очередь тоже может быть выражением. Значение выражения зависит от расположения знаков операций и круглых скобок в выражении, а также от приоритета выполнения операций. Примеры выражений:

А+В

A*(B+C)-(D-E)/F

Выражение в языке программирования С-51 состоит из операндов, которые комбинируются при помощи различных арифметических или логических операций, а также операций отношения. Над переменными-указателями возможно проведение адресных операций.

При вычислении выражений тип каждого операнда может быть преобразован к другому типу. Преобразования типов могут быть неявными, при выполнении операций и вызовов функций, или явными, при использовании функций приведения типов. Из-за того, что неявные преобразования типов могут различаться для трансляторов разных фирм, лучше при написании программы использовать явное преобразование. Примеры явных преобразований типов операндов:

а=(int)b+(int)с; //Переменные а и b могут быть восьмиразрядными. Преобразование типов нужно, чтобы избежать переполнения

s=sin((float)a/15)); //Если не преобразовать тип переменной а, то деление будет целочисленным и результат деления может быть равен нулю (если а<15).

В выражениях в качестве операндов могут использоваться подвыражения. Подвыражение - это обычное выражение, заключенное в скобки.

Подвыражения могут использоваться для группировки частей выражения, точно так же, как и в обычной алгебраической записи. Использование подвыражений позволяет сократить количество операторов в программе, а значит и объем исходного текста (но не объем исполняемого кода), однако одновременно оно затрудняет отладку этой программы.

Ваша оценка очень важна

0
Шрифт
Фон

Помогите Вашим друзьям узнать о библиотеке