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

ЖАНРЫ

Программирование на Objective-C 2.0
Шрифт:

определяется массив birthdays (дни рождения), содержащий 1 S элементов типа Struct date. Нужный элемент в массиве структур указывается естественным образом. Например, чтобы задать для второго элемента в массиве birthdays дату дня рождения 22 февраля 1996 г., можно написать последовательность birthdays[1].month = 2; birthdays[1]. day = 22; birthdays[1].year = 1996;

Оператор n = numberOfDays (birthdaysfO]);

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

Objective-C

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

Вы уже видели, как логически группировать месяц, день и год (month, day и year) в структуре с именем date. Предположим, что у нас есть аналогичная струк-тура с именем time для группирования часов, минут и секунд (hour, minutes и seconds). В некоторых приложениях может потребоваться логическая группи-ровка структур date и time — например, для списка событий с определенной датой и временем.

Из предыдущего описания следует, что нам нужны удобные средства, объе-диняющие дату и время. Это можно сделать в Objective-C, определив новую структуру (например, date_and_time), компоненты которой содержатся в элементах date и time. struct date_and_time { struct date sdate; struct time stime; };

Первый компонент этой структуры имеет тип struct date и называется sdate. Второй компонент структуры date_and_time имеет тип struct time и называется stime. В этом определении структуры date_and_time требуется, чтобы структура date и структура time были предварительно определены для компилятора.

Теперь можно определять переменные типа struct date_and_time: struct date_and_time event;

Для указания ссылки на структуру date в переменной event используется тот же синтаксис: event.sdate

Мы можем вызвать функцию dateUpdate, указав дату в качестве аргумента, чтобы получить результат в том же месте. event.sdate = dateUpdate (event.sdate);

То же самое можно сделать для структуры time, содержащейся в структуре date_and_time. event.stime = timeUpdate (event.stime);

Для указания определенного компонента внутри одной из этих структур нужно добавить точку и имя этого компонента: event.sdate.month = 10;

В этом операторе задается значение 10 (октябрь) для компонента month структуры date переменной event. В операторе ++event.stime.seconds;

значение компонента seconds структуры time увеличивается на 1.

Инициализировать переменную event можно уже известным способом: struct date_and_time event = {{ 12, 17, 1989 }, { 3, 30,0}};

Здесь для переменной event задается дата 17 декабря 1989 г. и время 3:30:00.

Массив структур date_and_time можно задать с помощью объявления struct date_and_time events[100];

Здесь объявляется, что массив events содержит 100 элементов типа struct date_and_time. Для указания 4-го элемента date_and_time в массиве нужно написать events[3], а для 25-й даты в массиве при обращении к функции dateUpdate нужно написать events[24].sdate = dateUpdate (events[24].sdate);

Чтобы записать 12 часов дня в первый элемент этого массива, применяется следующий набор операторов. events[0].stime.hour = 12; events[0].stime.minutes = 0; events[0].stime.seconds = 0; Дополнительно

о структурах

Определять структуру можно достаточно гибко. Во-первых, можно объявить переменную с определенным структурным типом одновременно с объявлением структуры. Для этого достаточно включить имя переменной (переменных) с завершающей точкой с запятой в определение структуры. Например, в следую-щем операторе определяется структура date и объявляются переменные todaysDate и purchaseDate этого типа. struct date { int month; int day; int year; } todaysDate, purchaseDate;

Вы можете присвоить этим переменным начальные значения обычным об-разом. Ниже определяется структура date и переменная todaysDate с указанием начальных значений. struct date { int month; int day; int year; } todaysDate = { 9, 25, 2010 };

Если все переменные определенного структурного типа определяются вместе с определением структуры, то можно не задавать имя структуры. Ниже оп-ределяется массив с именем dates, содержащий 100 элементов. struct { int month; int day; int year; } dates[ 100);

Каждый элемент является структурой, содержащей три целых компонента: month, day и year. Поскольку здесь не указывается имя структуры, при последующем объявлении переменных того же типа структуру придется явно определить снова. Битовые поля

В Objective-C имеются два способа упаковки информации. Первый способ — это представление данных внутри переменной целого типа и последующий доступ к нужным битам с помощью побитовых операций, описанных в главе 4.

Второй способ — это определение структуры упакованной информации с помощью конструкции Objective-C, которая называется битовым полем (bitfield). Для этого применяется специальный синтаксис в определении структуры, по-зволяющий определять поле битов и присваивать ему имя.

Для определения битовых полей можно определить структуру, например, с именем packedStruct. struct packedStruct { unsigned int f1:1; unsigned int f2:1; unsigned int f3:1; unsigned int type:4; unsigned int index:9; }

В соответствии с этим определением, структура packedStruct состоит из пяти компонентов. Первый компонент, Н, имеет тип unsigned int. Обозначение :1 после имени компонента указывает, что компонент будет содержаться в 1 бите. Флаги f2 и f3 определяются аналогичным образом. Компонент type занимает в соответствии с определением 4 бита, а компонент index имеет длину 9 битов.

Компилятор автоматически упаковывает подряд эти битовые поля. Удобство этого подхода состоит в том, что поля переменной типа packedStruct можно указывать как обычные компоненты структуры. Например, если объявлена пе-ременная packedData struct packedStruct packedData;

вы можете легко присвоить значение 7 полю type переменной packedData с по-мощью простого оператора packedData.type = 7;

Можно присвоить этому полю значение переменной п с помощью оператора packed Data.type = n;

В последнем случае вы можете не думать о том, что значение п может ока-заться слишком большим, чтобы уместиться в поле type; в packedData.type будут записаны только младшие 4 бита.

Извлечь значение из битового поля тоже непрудно. Например, с помощью оператора n = packedData.type;

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