Cтраница 3
![]() |
Программа удаления пробелов с помощью функции. [31] |
Основное различие между процедурами и функциями состоит в способе их вызова. В каком бы месте программы ни появились имя функции и список фактических параметров в выражении вызывающей программы, выполняется операторная часть функции, а последнее значение, присвоенное имени функции в операторной части функции, возвращается в выражение. На рис. 9.7 представлена программа, в которой используется функция чтения очередного символа, отличного от пробела, находящегося во входном тексте. [32]
Индекс можно рассматривать просто как условное число, передающее в функции чтения и записи информацию, о каком свойстве идет речь. Ниже приведен пример, в котором спецификаторы индексов используются в этом качестве. [33]
Тонкие магнитные пленки ( ТМП) в отношении быстродействия и технологичности имеют явные преимущества перед ферритовыми элементами. АЗУ, построенные на плоских однослойных [1] и цилиндрических [7] ТМП, обладают большим быстродействием и имеют высокую плотность размещения информации, но сохранили недостатки тороидальных сердечников - трудность реализации нестирающего чтения и суммарную помеху. АЗУ, использующие двухслойные ( низко - и высококоэрцитивные) пленки [ 81, легко реализуют функцию нестирающего чтения, но требуют два запоминающих элемента на одну ячейку. [34]
Функции чтения - интерпретации выполняются программой интерпретатором планировщика заданий. Интерпретатор читает операторы управления заданиями, анализирует их содержание-и строит таблицы, которые используются во время инициирования и выполнения пунктов ( шагов) задания. В случае приоритетного планирования интерпретатор обеспечивает занесение управляющей информации в очередь входных работ по приоритетам, а также перепись данных из входного потока заданий на запоминающее устройство прямого доступа. Функции чтения - интерпретации могут выполняться либо одновременно, либо независимо от обработки заданий. [35]
Чтобы показать вариант свойства с двумя индексами, в класс введен двумерный массив целых чисел FMatr. Доступ к этой матрице обеспечивает свойство Matr. Свойство предусматривает два индекса X и Y. Функция чтения GetMatr этого свойства принимает в качестве параметров эти два индекса и возвращает соответствующий им элемент матрицы. Процедура записи SetMatr принимает в качестве параметров индексы и значение элемента, заносимое в матрицу. [36]
Программа на рис. 6.10 расширяет наш класс Time так, чтобы он включал функции чтения и записи закрытых данных-элементов hour, minute и second. Функции записи жестко управляют установкой данных-элементов. Каждая функция чтения просто возвращает соответствующее значение данных-элементов. Программа сначала использует функции записи, чтобы задать правильные значения закрытым данным-элементам объекта t класса Time, затем использует функцию чтения, чтобы вывести эти значения на экран. Далее функции записи пытаются задать элементам hour и second неправильные значения, а элементу minute - правильное, и затем функции чтения направляют эти значения на экран. Результат подтверждает, что неправильные значения вызывают установку данных-элементов в нулевое состояние. Функция incrementMinutes не является элементом класса; поэтому она использует функции-элементы записи и чтения для соответствующего увеличения элемента minute. Это функционирует правильно, но снижает производительность из-за многократных вызовов функций. В следующей главе мы обсудим запись дружественных функций как средства устранения этого недостатка. [37]
В этом классе объявлен массив FCoord, содержащий 3 координаты вектора. Введены свойства доступа к этим координатам: X, Y, Z. Кроме того, введено индексированное ( см. разд. Coord, которое обеспечивает доступ к любой из трех координат путем указания индекса этой координаты: 1 - X, 2 - Y, 3 - Z. Функции чтения всех этих свойств возвращают значение элемента массива FCoord, соответствующего читаемой координате. [38]
В данном разделе собраны специализированные графические функции. Сюда относятся разнообразные диаграммы ( area, bar, barh, pie и др.), рассмотренные нами ранее функции stem, stairs, contour и contourf, а также многие другие. Особый интерес представляют функции, имена которых начинаются с букв ez ( от easy - легкий) - ezplot, ezpolar, ezcontour, ezcontourf, ezgraphS, ezmesh, ezmeshc, ezplotS, ezsurf и ezsurfc. Они позволяют строить графики соответствующих типов ( см. раздел Графика приложения А), задавая не массивы даных, а строки, в которых записаны формулы для вычислений. Также в данном разделе имеются функции чтения и записи графических файлов, трехмерной визуализации и анимации. [39]
При организации обмена данными с помощью отображаемых файлов нам необходимо решить одну проблему, которая раньше перед нами не возникала. Данные, записанные в отображаемый файл одним процессом, становятся доступными всем процессам, отображающим этот файл. Но нужно еще, чтобы существовал какой-то механизм, с помощью которого один процесс мог бы оповестить другие процессы о том, что он предоставил данные для обмена. В примере с именованными каналами мы воспользовались блокирующей функцией чтения, которая возвращала управление процессу-серверу только тогда, когда клиент посылал данные в канал. [40]
Программа на рис. 6.10 расширяет наш класс Time так, чтобы он включал функции чтения и записи закрытых данных-элементов hour, minute и second. Функции записи жестко управляют установкой данных-элементов. Каждая функция чтения просто возвращает соответствующее значение данных-элементов. Программа сначала использует функции записи, чтобы задать правильные значения закрытым данным-элементам объекта t класса Time, затем использует функцию чтения, чтобы вывести эти значения на экран. Далее функции записи пытаются задать элементам hour и second неправильные значения, а элементу minute - правильное, и затем функции чтения направляют эти значения на экран. Результат подтверждает, что неправильные значения вызывают установку данных-элементов в нулевое состояние. Функция incrementMinutes не является элементом класса; поэтому она использует функции-элементы записи и чтения для соответствующего увеличения элемента minute. Это функционирует правильно, но снижает производительность из-за многократных вызовов функций. В следующей главе мы обсудим запись дружественных функций как средства устранения этого недостатка. [41]
Элементы, объявленные в классе в разделах strict private и strict protected, видимы и доступны только из методов данного класса. Из других функций и процедур такие элементы недоступны. В приложениях Windows Forms в этот раздел автоматически помещаются объявления всех компонентов формы. В приложениях VCL раздел strict private автоматически не создается. Если желательно получить доступ из внешних процедур к свойствам объектов, объявленных в разделе strict private, это наиболее грамотно можно сделать, объявив в разделе public класса соответствующее свойство property и снабдив его функциями чтения и записи ( см. разд. [42]
Свойство IList должно возвращать индекс строки, содержащейся в списке FList. Это пример того, что индекс свойства может иметь любой тип. В данном случае индекс имеет тип строки string. Поэтому функция записи для него не задана. Имеется только функция чтения GetlList, которая принимает в качестве параметра искомую строку и возвращает ее индекс. [43]
В этом классе объявлен массив FCoord, содержащий 3 координаты вектора. Введены свойства доступа к этим координатам: X, Y, Z. Кроме того, введено индексированное ( см. разд. Coord, которое обеспечивает доступ к любой из трех координат путем указания индекса этой координаты: 1 - X, 2 - Y, 3 - Z. Функции чтения всех этих свойств возвращают значение элемента массива FCoord, соответствующего читаемой координате. Можно было бы, конечно, реализовать все эти функции чтения и записи отдельно. [44]
Функция называется блокирующей ( синхронной), если она приостанавливает вызвавший ве поток до окончания выполнения своей работы. Асинхронные функции возвращают управление потоку еще до того, как порученная им работа выполнена. Например, функция записи данных в дисковый файл может передать записываемые данные другой подсистеме Windows и вернуть управление вызвавшему ее потоку до того, как данные будут действительно записаны на диск. Блокирующая функция вернет управление только тогда, когда запись данных на диск действительно закончится. При использовании асинхронных функций могут возникнуть проблемы, связанные с тем, что программа может, например, попытаться выполнить операцию записи следующего блока данных до окончания записи предыдущего блока, а это, в свою очередь, может нарушить целостность данных. С другой стороны, асинхронные функции уменьшают время простаивания программы. Кроме того, они могут использоваться для проверки наличия данных. Например, синхронная функция чтения данных из канала приостановит поток до появления данных ( что может быть нежелательно), тогда как асинхронная вернет управление сразу, передав вызывающему потоку информацию о том, что в канале нет данных. [45]