Лекции. Основные понятия и определения
Скачать 1.94 Mb.
|
10.8. Тип object (B)Данные типа Object могут содержать значения других типов данных во время выполнения одной программы. Переменные этого типа или, вообще, не имеют определения (неявное объявление) или объявляются с ключевым словом Object: Dim <имя_переменной> As Oblect. Переменная такого типа содержит адрес объекта, который был ей присвоен. Этот адрес всегда занимает 4 байта памяти, однако надо иметь в виду, что под само значение также выделяется память.Таким образом можно считать, что переменная типа Object занимает 4 байта+объем под значение. В выражениях переменные типа Object ведут себя в соответствии с типом присвоенного значения. Если было присвоено значение типа Integer, то переменная работает как целая, если – типа String, то – как строка. Транслятор сам распознает внутренний тип переменной. Замечание. На первый взгляд применение данных этого типа удобно. Их можно не объявлять, не думать о преобразованиях значений в выражениях, предоставляя это транслятору. Однако есть следующие возражения: - данные занимают, в общем случае, больше памяти, чем переменные обычных типов; - их употребление может привести к труднообнаруживаемым ошибкам. Например, оператор "+" применим и к числовым, и к строковым данным. В первом случае он выполняет операцию сложения, во втором – сцепление. Пример. a="10" b="11" a+b → "1011" b=11 a+b → 21 Если один операнд типа Object содержит числовое значение, а второй – строковое, то второй операнд будет преобразован в число, если это возможно, если нет, то возникнет ошибка Type mismatch (Несогласование типов). При необходимости получения строкового результата нужно использовать оператор "&". Рекомендация. По возможности не следует использовать данные типа Object. По крайней мере, это надо делать при достаточном опыте программирования. 10.9. Тип delegate (B)Этот тип может выполнять ту же функцию, что объект языка C++ - указатель на функцию. Данные этого типа объявляются на уровне модуля вне процедур как новый тип данных и доступны всем модулям программы. Формат объявления: Delegate {Function | Sub} <имя> ([<список параметров>]) [As <тип>] Для подпрограммы тип возвращаемого значения отсутствует. Пример. Объявление типа UndInteg для вызова любого функции (метода), принимающего 1 параметр типа Double и возвращающего значение типа Double. См. интегрирование методом трапеций в разделе 7.3.2. Delegate Function UndInteg(ByVal x As Double) As Double Для функций, имеющих другой список параметров и тип возвращаемого значения (или его не имеющего для Sub) надо объявлять другой тип делегата. Пример. Для обычного и максиминного умножения матриц. Delegate Sub MultMatrix(ByVal m As Short, ByVal n As Short, _ ByVal p As Short, ByRef a(,) As Single, _ ByRef b(,) As Single, ByRef c(,) As Single) В вызывающей процедуре должны объявляться переменные типа делегата, которым можно задавать адреса нужных функций. Пример. Dim DelF1 As UndInteg ' Переменная типа делегата ………………………….. DelF1=AddressOf F1 ‘ Задание адреса функции F1 …………………………. ' Передача адреса подинтегральной функции в процедуру интегрирования y = Integr(0.15, alfa, 200, DelF1) Функция Integr имеет следующий заголовок: Function Integr(ByVal a AsDouble, ByVal b AsDouble, ByVal k As Short, _ ByRef F As UndInteg) Параметр F имеет тип делегата UndInteg и может принимать адрес любой подинтегральной функции, что делает процедуру интегрирования универсальной. |