Чтение онлайн

ЖАНРЫ

Встраиваемые системы. Проектирование приложений на микроконтроллерах семейства 68HC12/HCS12 с применением языка С

Пак Дэниэл Дж.

Шрифт:

Структуры создаются с использованием динамических методов распределения памяти. Как мы уже упоминали, команда

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

сar_temp_ptr new_car_entry;

new_car_entry = (car_temp_ptr)malloc(sizeof(ELEMENT));

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

–>
, чтобы обратиться
к специфическому полю внутри структуры.

/* инициализация новых полей для структуры car */

new_car_entry–>year = 1981; /* год производства */

strcpy(new_car_entry–>make, "Chevy"); /*BWM, Hummer, Saturn */

strcpy(new_car_entry–>model, "Camaro"); /*купе, обратимый, SUV, пикап */

strcpy(new_car_entry–>VIN, " 12Z3 67"); /* комбинация цифр, букв*/

new_car_entry–>mileage = 37456; /*показания спидометра: от 0 до 500,000+ */

new_car_entry–>next = NULL; /* определяет указатель на автомобиль */

Чтобы распечатать различные поля записи, мы могли бы использовать следующий код:

printf("\nyear: %4d ", new_car_entry–>year); / *year mfg */

printf("\nmake: %s ", new_car_entry–>make); /*car делает */

printf("\nmodel: %s ", new_car_entry–>model); /*model*/

printf("\nVIN: является ", new_car_entry–>VIN); /*VIN */

printf("\nMileage: %6.of ", new_car_entry –> mileage); /*odometer reading*/

Поместим все эти части вместе с примером. Мы убедительно просим вас компилировать и выполнить этот код.

#include <stdio.h> /*стандартные входные/выходные функции*/

#include <stdlib.h> /*библиотека и распределение памяти */

void main(void) {

 /*определение структуры */

 struct car;

 int year; /*год выпуска */

 char make[10]; /*BWM, Hummer, Saturn*/

 char model[12]; /*купе, обратимый, SUV, пикап */

 char VIN[10]; /*комбинация цифр и букв*/

 float mileage; /*показания одометра: от 0 до 500 000+ */

 struct car *next; /*указатель на следующий автомобиль в списке */

 typedef struct car ELEMENT;

 typedef ELEMENT *car_temp_ptr;

 car_temp_ptr new_car_entry; /*ввод записи для автомобиля*/

 new_car_entry = (car_temp_ptr)malloc(sizeof(ELEMENT));

 /*инициализация новых полей для автомобиля */

 new_car_entry->year = 1981; /*год изготовления*/

 strcpy(new_car_entry–>make, "Chevy"); /*BWM, Hummer, Saturn */

 strcpy(new_car_entry–>model,"Camaro");

 /* купе, обратимый, SUV, пикап */

 strcpy(new_car_entry–>VIN, "12Z3 67");

 /* комбинация цифр и букв */

 new_car_entry–>mileage - 37456;/*показания одометра: 0 to 500,000+*/

 new_car_entry–>next - NULL; /*указатель на следующий автомобиль в списке*/

 printf("\nyear: %4d", new_car_entry–>year); /*год выпуска */

 printf("\nmake: %s", new_car_entry–>make) ; /*производитель */

 printf("\nmodel: %s", new_car_entry–>model); /*модель */

 printf("\nVIN: %s ", new_car_entry –>VIN); /*номер */

 printf("\nMileage: %6.
Из ", new_car_entry->mileage); /*показания одометра*/

}

Когда эта программа будет откомпилирована и выполнена, на экране вашего ПК появится следующее сообщение:

year: 1981

make: Chevy

model: Camaro

VIN: 12Z367

Mileage: 37456

Пока, наверное, использование динамического распределения памяти не кажется вам очень мощным инструментом. В следующем разделе вы сможете оценить силу динамического распределения памяти, когда мы скомпонуем записи и создадим список, что позволит нам осуществлять изменения в процессе выполнения программы. То есть мы сможем добавлять новые элементы в список, переносить элементы из одного списка в другой, удалять элементы из списка, и т.д. Но не будем здесь углубляться в лес деталей, чтобы сразу в нем не заблудиться. Лучше сосредоточим свое внимание на дороге через этот лес. Не будем забывать, что мы изучаем здесь основные структуры данных, чтобы узнать, как они могут использоваться в построении и реализации операционной системы в режиме реального времени.

Список с указателями. Список с указателями является мощной структурой данных, которая может быть создана, вставлена в программу или удалена из нее динамически в процессе выполнения программы. Список связей состоит из узлов, содержащих две части: часть данных и часть поля связи. Часть данных хранится информация об узле (или пункте) списка. Например, если мы должны были создать список автомобилей, готовых к продаже, частью данных для узла будет структура (или запись) car, которую мы разработали в предыдущем разделе. Полем связи был бы указатель (адрес памяти) следующую запись в списке. Начало списка названо головой (head). Конец списка называется хвостом (tail) и обозначается символом нуля (?) в поле связи. Это построение списка иллюстрируется на рис. 8.5. Здесь приведено объявление различных списков, позволяющих автомобильным дилерам проследить за состоянием парка автомобилей.

car_temp_ptr head_ptr; /*начало списка состояния автомобилей */

car_temp_ptr in_stock_list; / *автомобили в наличии */

car_temp_ptr repair_list; /*автомобили в ремонтных мастерских - не предназначены для продажи */

car_temp_ptr paint_shop_list; /*автомобили в мастерских покраски - не предназначены для продажи */

car_temp_ptr sold_list; /*проданные автомобили - не предназначены для продажи */

Мир автомобильных продаж очень динамичен. Автомобильные дилеры постоянно продают автомобили, занимаются их обменом, размещают автомобили в мастерских для ремонта, или даже производят перекрашивание автомобилей. Если нам необходимо создать список для каждого из этих действий, мы будем постоянно добавлять и удалять элементы в каждом из списков. Эти действия иллюстрируются на рис. 8.5в и 8.5г.

Рис. 8.5. Операции со списком a) список состоит из узла с данными и указателя, мента в список, г) удаление элемента

Чтобы вставить новый автомобиль в список, мы были бы должны найти соответствующее место для автомобиля в существующем списке. Например, если мы размещаем автомобили в алфавитном порядок, мы должны просматривать список, пока мы не найдем, соответствующее место чтобы вставить автомобиль в список, как показано на рис. 8.6. Как только соответствующая точка ввода найдена, указатель предшествующего узла должен быть изменен, чтобы указать на новый автомобиль, и указатель нового автомобиля должен быть изменен, чтобы указать на следующий автомобиль в списке.

Поделиться с друзьями: