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

на главную - закладки

Жанры

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

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

Чтобы передать функции или методу один элемент массива, его нужно указать как аргумент. Например, если функция squareRoot вычисляет квадратные корни, и мы хотим получить квадратный корень от averages[i] и присвоить результат переменной sq_root_result. то можно написать оператор sq_root_result = squareRoot (averagesfi]);

Передача всего массива функции или методу выполняется иначе. При вызове функции или метода нужно указать только имя этого массива (без индексов). Например, если grade_scores был объявлен как массив, содержащий 100 эле-ментов, выражение minimum (grade_scores)

будет передавать все 100 элементов, содержащихся в массиве grade_score$, функции с именем minimum. Конечно, функция minimum должна ожидать передачи всего массива как ар|умента и иметь соответствующее объявление формального параметра.

Следующая функция ищет минимальное целое значение в массиве с ука-занным количеством элементов. // Функция для поиска минимума в массиве int minimum (int values[], int numElements) { int minValue, i; minVaiue = values[0]; for (i = 1; i < numBements; ++i) if ( values[i] < minValue ) minValue = values[i]; return (minValue); }

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

Формальный параметр numElements используется как верхний предел в опе-раторе for. С помощью оператора for выполняется перебор всего массива от элемента values[1] до последнего элемента vaiues[numElements-1].

Если функция или метод изменяет значение элемента массива, это изменение вносится в исходный массив, переданный функции или методу. Это изменение остается в силе даже после того, как функция или метод закончит свое выполнение.

Работа с целым массивом происходит иным образом, чем с простой пере-менной или элементом массива (значения которых функция или метод не может изменить). Мы уже говорили, что при вызове функции или метода значения, передаваемые как аргументы, копируются в соответствующие формальные параметры, но при работе с массивами содержимое всего массива не копируется R массив формального параметра. Вместо этого передается указатель, пока-зывающий, где в памяти компьютера размещен этот массив. Таким образом, любые изменения, внесенные в массив формального параметра, на самом деле вносятся в исходный массив, а нс в копию этого массива. Поэтому при выходе из функции или метода эти изменения остаются действительными. Многомерные массивы

Элемент многомерного массива можно передавать функции или методу как обычную переменную или элемент одномерного массива. В строке result = squareRoot (matrix[i][j]);

происходит вызов функции squareRoot с передачей в качестве аргумента значе-ния, содержащегося в matrix[i][j].

В качестве аргумента можно передать весь многомерный массив так же, как одномерный массив: нужно просто указать имя самого массива. Например, если матрица measuredValues объявлена как двумерный массив с целыми значениями, то оператор Objective-C scalarMultipiy (measuredValues, constant);

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

Мы уже говорили, что в случае объявления одномерного массива как фор-мального параметра нам не нужен конкретный размер массива. Мы просто ис-пользуем пару прямоугольных скобок, чтобы информировать компилятор Objective-C, что параметр является массивом. В случае многомерных массивов это применимо лишь отчасти. Для двумерного массива можно не указывать число строк массива, но объявление должно содержать число столбцов массива. Оба объявления int arrayValues[100][50]

и int arrayValues[][50]

являются допустимыми для массива формального параметра с именем arrayValues, который содержит 100 строк и 50 столбцов. Однако оба объявления int arrayValues[100][]

и int arrayValues[][]

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

Помимо массивов, язык Objective-C содержит еще одно средство группирования элементов — структуры.

Предположим, что нам нужно нам нужно сохранить внутри программы дату (например, 18/07/09), чтобы использовать ее для заголовка результатов программы или для вычислений. Обычный способ сохранения даты — это присвоить месяц целой переменной с именем month, день — целой переменной day и год — целой переменной year. Поэтому здесь вполне подойдут операторы int month = 7, day = 18, year = 2009;

Но как быть, если в программе требуется сохранять несколько дат? Следо-вало бы сгруппировать эти наборы из трех переменных.

В языке Objective-C мы можем определить структуру с именем date (дата), которая состоит из трех компонентов, представляющих месяц, день и год. Син-таксис такого определения достаточно очевиден. struct date { int month; int day; int year; };

Только что определенная структура date содержит три целых компонента с именами month, day и year. Такое определение даты — новый тип переменных, переменные теперь можно объявлять с типом struct date, как в следующем опре делении: struct date today;

Мы можем определить переменную такого же типа purchaseDate (дата покупки) с помощью отдельного определения struct date purchaseDate;

или просто включить оба определения в одну строку: struct date today, purchaseDate;

В отличие от переменных типа int, float или char, при работе со структурными переменными требуется специальный синтаксис. Для доступа к компоненту структуры нужно указать имя структурной переменной, после которого следует точка (она называется оператором «точка» — dot operator) затем имя компо нента структуры. Например, чтобы задать значение 21 для компонента day переменной today, нужно написать today.day = 21;

Отметим, что между именем переменной, точкой и именем компонента не допускаются пробелы.

Вы можете возразить, что мы уже использовали, казалось бы, такой же опе-ратор для вызова свойства объекта. Вспомним, что оператор myRect.width = 12;

вызывает метод-установщика (с именем sefWidth) объекта класса Rectangle, передавая ему значение аргумента 12. Здесь нет никакой путаницы: компилятор сам определяет, что находится справа от оператора «точка», — структура или объект, — и выполняет соответствующую обработку.

Поделиться:
Популярные книги

Дважды одаренный. Том III

Тарс Элиан
3. Дважды одаренный
Фантастика:
альтернативная история
аниме
фэнтези
фантастика: прочее
юмористическое фэнтези
5.00
рейтинг книги
Дважды одаренный. Том III

"Фантастика 2025-103". Компиляция. Книги 1-17

Поселягин Владимир Геннадьевич
Фантастика 2025. Компиляция
Фантастика:
боевая фантастика
попаданцы
альтернативная история
фэнтези
5.00
рейтинг книги
Фантастика 2025-103. Компиляция. Книги 1-17

Академия

Сай Ярослав
2. Медорфенов
Фантастика:
юмористическая фантастика
попаданцы
аниме
5.00
рейтинг книги
Академия

Искатель 4

Шиленко Сергей
4. Валинор
Фантастика:
рпг
фэнтези
попаданцы
5.00
рейтинг книги
Искатель 4

Наследник жаждет титул

Тарс Элиан
4. Десять Принцев Российской Империи
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Наследник жаждет титул

Я Гордый часть 2

Машуков Тимур
2. Стальные яйца
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Я Гордый часть 2

Идеальный мир для Демонолога 10

Сапфир Олег
10. Демонолог
Фантастика:
боевая фантастика
юмористическая фантастика
аниме
5.00
рейтинг книги
Идеальный мир для Демонолога 10

Кодекс Охотника. Книга XXIV

Винокуров Юрий
24. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Охотника. Книга XXIV

Царь царей

Билик Дмитрий Александрович
9. Бедовый
Фантастика:
фэнтези
мистика
5.00
рейтинг книги
Царь царей

Враг из прошлого тысячелетия

Еслер Андрей
4. Соприкосновение миров
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Враг из прошлого тысячелетия

На границе империй. Том 5

INDIGO
5. Фортуна дама переменчивая
Фантастика:
боевая фантастика
попаданцы
7.50
рейтинг книги
На границе империй. Том 5

Агенты ВКС

Вайс Александр
3. Фронтир
Фантастика:
боевая фантастика
космическая фантастика
5.00
рейтинг книги
Агенты ВКС

Двойник короля 19

Скабер Артемий
19. Двойник Короля
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Двойник короля 19

Бестужев. Служба Государевой Безопасности

Измайлов Сергей
1. Граф Бестужев
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Бестужев. Служба Государевой Безопасности