Применение typedef, struct и union


Полезные описания переменных

Часто необходимо в памяти расположить последовательно разные виды данных, что бы потом можно было их использовать.

Полезные ссылки

Взято и переработано с сайта
http://www.butovo.com/~zss/cpp/struct.htm
http://cppstudio.com/post/9172/

Синтаксис структур.

Структуры в языке С аналогичны массиву тесно связанных атрибутов. Однако, в отличие от массива, структура позволяет иметь смешанные атрибуты различных типов данных.
Структура создается при помощи ключевого слова struct, за которым следует имя_типа (имя структуры) и список элементов. Описание структуры заканчивается точкой с запятой, т.к. оно является оператором:

Пример описания структуры:

Эта структура описывает новый тип данных stboat и содержит три текстовых поля, одно целое и одно действительное.
С описанной структурой не связывается никакая переменная. Для создания новой переменной используется оператор (слово struct является необязательным):

Для вышеприведенного примера можно создать переменную used_boat:

Если со структурой связывается только одна переменная, то ее можно объявить непосредственно в описании структуры перед точкой с запятой. Имя_типа в этом случае можно опустить:

Доступ к элементам структуры.

Для обращения к отдельным элементам структуры используется операция обращения к члену структуры – “точка”. Она разделяет имя структурной переменной и имя поля, например

Элементы структуры обрабатываются также, как и любые другие переменные С, необходимо только использовать операцию “точка”.
Можно создавать массивы структур и указатели на структуру, для обращения к элементам структуры предусмотрен оператор “->” (стрелка, он состоит из знаков минус и больше).

Передача структур в функции.

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

Структуры и битовые поля.

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

В таких структурах можно использовать только целочисленные типы:

Объединения.

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

Будет располагаться в памяти последовательно

номер байта название переменной тип
байт 0 tipe[0] char
байт 1 tipe[1] char
байт 2 title char
байт 3 year int
байт 4

В объединении, например:

расположение переменных в памяти, типа наложение

номер байта переменная c invalue fvalue
байт 0
байт 1
байт 1
байт 2

Переменная с будет иметь значение младшего байта переменных invalue и fvalue…

Объединение создается при помощи ключевого слова union:

К членам объединения можно обращаться так же, как и к членам структур, либо через операцию “точка”, либо через операцию “->” – для указателей:

Вариант объединения структур

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

в этом варианте, компилятор XC16 v 1.26 разместил данные long с байта 4

Дополнительные средства (typedef и enum).

При помощи оператора typedef можно связать новые типы данных с существующими:

После такого описания можно использовать real вместо double.
Использовать typedef необходимо с осторожностью. Слишком много новых типов могут ухудшить читаемость программы.
Перечисляемый тип данных enum позволяет определить список последовательных целых чисел, каждое из которых имеет собственное имя. Объявление перечисляемого типа выглядит следующим образом:

Здесь имя1, имя2,… – это имена констант. Им можно присваивать целочисленные значения. Если значения отсутствуют, то предполагается, что они последовательно увеличиваются на единицу, начинаясь с нуля. Память под эти константы во время выполнения не выделяется, поэтому удобно использовать этот оператор для создания констант, если не указывать имя_типа и переменную:

Тип enum часто используется, когда информацию можно представить списком целых значений, подобно номерам дней недели или месяцев в году:

Поскольку имена эквивалентны последовательным целым значениям, то с ними можно выполнять арифметические операции. Фактически в данном примере переменной current_month присваивается целочисленное значение 12.

Создание внешних переменных которые должны быть доступны из подключаемых библиотек

Например есть библиотека spi.h, в ней необходимо описать объединение и сделать так чтобы она была доступна в основной программе

В самом файле где предстоит использовать надо описать

дополнение возможно…



Это может быть интересно


  • Проект с использованием MCC часть 15Проект с использованием MCC часть 15
    EUSART – Универсальный асинхронный приёмопередатчик (УАПП, англ. Universal Asynchronous Receiver-Transmitter, UART) — узел вычислительных устройств, предназначенный для организации связи с другими цифровыми устройствами. … читать на вики. Внесем изменения в нашу схему, добавим выход …
  • MPLAB® Code Configurator and EncoderMPLAB® Code Configurator and Encoder
    Еще раз про энкодер… Для некоторых приложений очень удобно и экономически выгодно, для настройки и управления использовать энкодер. Такие энкодеры имеют строенную тактовую кнопку которую можно применить для выбора режимов работы …
  • HVLD модуль на примере PIC24FJ128GA204HVLD модуль на примере PIC24FJ128GA204
    HVLD модуль представляет собой простое устройство, для контроля напряжения питания микроконтроллера или внешнего напряжения (через делитель). Его задача при “выходе” напряжения за заданные пределы сформировать сообщение микроконтроллеру, что необходимо выполнить …
  • Универсальный терморегулятор ch-c3000Универсальный терморегулятор ch-c3000
    Терморегулятор ch-c3000 предназначен для управления системами регулирования температуры в пределах от – (минус) 55 до + 125 С. Регулятор может использоваться как в системах отопления, так и в системах охлаждения …
  • ESP32-первое знакомствоESP32-первое знакомство
    Музыкальная тема к статье, слушаем: Настало время познакомиться c ESP32 и для меня, для этого я приобрел в ГАММЕ отладочную плату с модулем ESP-WROOM-32 (ESP32-DevKitC). Первая задача, как он подключается, …
  • PIC18F25K42 – v. A001 – выявленные баги.PIC18F25K42 – v. A001 – выявленные баги.
    Модуль I2C Не работает при использовании в стандартной конфигурации MCC. Требует особой нестандартной конфигурации и управления для нормальной работы. Обойти Обход проблемы возможен библиотека см статью. Модуль ADC2 На выводе RA0, …
  • Проект с использованием MCC часть 07Проект с использованием MCC часть 07
    Модуль PWM – широтно импульсная модуляция (ШИМ). ПИК контроллеры часто на борту имеют модули ШИМ. На их основе строятся многие узлы управления электро приводами. В нашем варианте мы будем его …
  • Индикатор кода – RC-5 Protocol PhilipsИндикатор кода – RC-5 Protocol Philips
    Индикатор кода – RC-5 Protocol Philips При конструировании дистанционного управления на инфракрасных лучах для контроля удобно иметь индикатор кодов передаваемых пультом. Плата ch-c3000 позволяет изготавливать устройства с возможностью установки фото …
  • MPLAB® Harmony – или как это просто! Часть 3.MPLAB® Harmony – или как это просто! Часть 3.
    Часть третья – копнём немного глубже. Вы наверное заметили, что во второй главе, вроде сначала все шло как по маслу, а потом, что бы заморгали светики, я вставил в код …
  • PIC18 – модуль DMAPIC18 – модуль DMA
    Введение   Модуль прямого доступа к памяти (DMA) предназначен для обслуживания передачи данных непосредственно между различными областями памяти без вмешательства процессора. Исключив при этом необходимость в интенсивной  обработки прерываний процессором, …



В записи нет меток.

Поделись этим!

Catcatcat

catcatcat

Development of embedded systems based on Microchip microcontrollers.