Матросов А.В. Maple 6. Решение задач высшей математики и механики (1185909), страница 63
Текст из файла (страница 63)
Этим процедурам в качестве параметров передаются произвольные объекты, обладающие определенными методами, что и дало им название общих, а сами методы вызываются в теле соответствующих процедур. Общие процедуры для вызова соответствующих методов нашего объекта представлены в примере 53).
> Гьтвт := ртос( оЬЗ:: тобп1е') 1г тетпет( 'деГР1твт', оЬ5) ГЬеп оЬ5:-детввгвГ() е1ве егтог "Объект не поддерзиеает метод: деГЪ1", ртоспззае епс( 1т епб ртос: яесопб :- ртос( оЬ5::'дюбп1е') Часть (. Основы )Ыар(е 1Г таееЬег( 'Чесзесопб', оЬЗ) ГЬеп оЬЗ:-оесзесопб() е1зе еггог "Объект не поддерживает метод: Чейз)", ргоспаке епб 1Г епб ргос: яесгьгзГ := ргос( оЬЯ::'побп1е', ч) 11 текЬЕг( 'ЯЕГР1гзс', оЬЗ) Ьдеп оЬ1:-яегг1гяг(ч) е1зе еггог "Объект не поддерживает метод: 1)", ргоспате епб 11 епб ргос: зесяесопб := ргос( оЬЗ::'кобп1е', ч) 11 кекпег( 'яеГЯесопб', оЬ1) ГЬеп оЬЗ:-зепзесопб(ч) е1яе еггог "Объект не поддерживает метод: $1", ргоспате епб 11 епб ргос: Теперь вызов методов объекта Р1 выглядит "лучше", чем с использованием операции: — : > Рьгяс(рт)) > зетзесопб(Р1, 1мчпба) > 11гзс(Р1),зесопб(Р1): Н а > 11гзс (1); еггог, (1п еьгзг) Объект не поддерживает метод: деггтгзг Более того, зти процедуры позволяют, соответственно, инициировать методы чеггтгяг, зегг1гзг, чегзесопб и яегзесопб любого объекта, который их реализует.
Можно упростить общие процедуры вызова методов объектов, реализующих связанную пару значений, использовав возможность Мар(е определять новые типы. В нашем случае определим тип разг Как тип модуяя, зксПОртИ- рующего четыре процедуры — дегг1гзг, зегг1гзг, оегяесопб и зегяесопб: > 'Гуре/рагг' := ''иобп1е'( ЧеГР1гзс, сепяесопб, зеГР1гяс, зесяесопб)': Тогда наши общие процедуры перепишутся в следующем виде, в котором проверка существования соответствующих процедур в передаваемых объектах будет возложена на Мар!е: Глава о.
Основы программирования в )Иар)в > Г1тят :- ргос( оЬ)::ра1т) оЬ?т-Ветргтят() етб ртос: яесопб := ртос( оЬ?::ра1т) оЬ1:-детзесопб() епб ргос: яеттгтят := ртос( оЬ)::ра1т, г) оЬ1:-яетГ1гят(г) епб ргос: яетяесопб := ргос( оЬ)::раьг, г) оЬ?:-яетзесопб(ч) епб ртос: > Гггят(1); Еггот, (гп тьтят) кобп1е боев пот ехротт 'оетт1гят' В справочной системе Мар)е есть файлы с примерами создания объектов и пакетов. Посмотрите файлы справки ?ехыпр1ея/оьь ?ехатр1ея?оеео н ?ехагпр1ея/Ь1пагутгее.
5.4.2. Вызов внешних процедур Одной из привлекательных возможностей, включенных в версию Мар)е 6, является возможность вызова внешних откомпилированных и сохраненных в статической библиотеке процедур, написанных на языке С. Организация подобного взаимодействия осуществляется с помощью новой технологии Мар1Е, СОСтОящсй В тОМ, ЧтО С ПОМОЩЬЮ СПЕцИаЛЬНОй КОМаНдЫ бетгпе ехтегпа1() ГЕНЕрИруЕтСя Пара ИНтЕрфЕйСНЫХ фуНКцИй — Одиа НаПИСаННая на языке Мар!е, а вторая на С. Они совместно реализуют механизм вызова внешней функции: передачу ей значений в требуемом формате языка С и возврат значений в формате Мар!е, При работе в операционной системе %1пдогуз сгенерированная'Мар!е на языке С интерфейсная функция компилируется и вместе с внешней процедурой С, которую пользователь желает вызвать из рабочего листа Мар!е, помещается в динамически подключаемую библиотеку 0Е1..
Эта библиотека при вызове внешней процедуры С подключается к выполняющемуся ядру Мар!е и находящаяся в ней интерфейсная функция выполняет вызов процедуры С. Алгоритм вызова внешней функции таков. Если пользователь вызывает внешнюю процедуру С, то автоматически осуществляется вызов интерфейсной функции, написанной на Мар1е, которая инициирует интерфейсную функцию, написанную на С. Эта последняя осуществляет преобразование типов передаваемых в вызываемую процедуру данных в формат языка С и ЗатЕМ ВЫЗЫВаст ВНЕШНЮЮ ПрОцЕдуру ЧЕРЕЗ ВетрОЕННуЮ фуНКцИЮ са11 ехтегпа1.
Часть 1 Основы 1к1ар1е 340 После завершения выполнения внешней процедуры интерфейсная С-функция преобразует возвращаемые данные в формат Мар!е и передает управление интерфейсной Мар!е-функции, которая и осуществляет непосредственный возврат полученных значений на рабочий лист Мар!е. Замечание Именно с использованием подобного механизма пакет 11пеагл1оеьга обращается к составляющим его программам численных методов линейной алгебры пакета НАС.
КОМаНда Ое11 ехсегца1О, КОНСтрунруЮщая И ВОЗВращаЮщая фуНКцИЮ, которую в дальнейшем пользователь может использовать для действительного обращения к внешней процедуре С, имеет следующий синтаксис: г1е11пе ехвегпа1(имя функции, арг1, ..., аргп, тип возвр значения, опции1 Параметр иия функции задает имя вызываемой внешней процедуры. Следующие за ним параметры вида аргн, где н — целое число, описывают формальные параметры вызываемой процедуры в том порядке, в каком они определены во внешней процедуре.
Возвращаемое значение функции описывается параметром тиц возвр значения аналогично описанию типов формальных параметров. Последними задаются опции в форме уравнений, которые уточняют некоторые детали: имя библиотеки, содержащей внешнюю процедуру, расположение компилятора С и его некоторые опции и т. п. Для вызова внешних процедур необходим установленный на компьютере пользователя компилятор С. Мар!е распространяется с заранее предопределенной командой вызова компилятора С для компиляции и сборки интерфейсной С-функции.
Для разных операционных систем предусматриваются разные компиляторы, например, для операционной системы уу|поовгв предполагается компилятор С фирмы М!сгозой. Опции команды аеггпе ехсегпа1 [ ~ позволяют использовать компилятор, отличный от используемого по умолчанию. Каждый формальный параметр внешней процедуры описывается в виде: идентификатор::дескриптор Идентификатор представляет собой имя переменной величины Мар1е, которой не присвоено никакого значения. Для возвращаемого значения внешней процедуры используется идентификатор вктцвн. Дескриптор описывает тип данных формального параметра, простой или сложный.
К сложным типам данных в С относятся массив, структура, объединение и перечисляемый тип. Дескриптор простого типа данных представляет имя типа с указанием в квадратных скобках отведенного количества байтов для хранения этого типа во внешней процедуре: Глава 5, Основы программирования в Мар[е 0 ьсетеап [вел саят! — булевский тип, принимающий значение есае (1) или Га1ае (О).
0 ьпседес[аеп саяе! — целое со знаком, количество отводимых байтов зависит от используемого компилятора С и обычно принимает значение 2, 4 или 8. Соответствующие значения Мар)е должны быть типа ьпседе . [З г1еас [вел саят! — вещественное число с плавающей точкой, количество отводимых байтов зависит от используемого компилятора С и обычно принимает значение 4, 8, 10, 12 или 16. Соответствующие значения Мар!е должны быть типа и еегьс.
С) сетр1еа[асп еая 1 — пара вещественных чисел с плавающей точкой с заданным количеством отведенных для хранения байтов. Соответствующие значения Мар[е должны быть типа сстр1еа. С) сьаг[ееп саяе! — один символ, для хранения которого отводится заданное число байтов. Если параметр кол байт имеет значение большее, чем т, то старшие байты должны солержать нули, тогда как в младшем байте должен содержаться код символа.
Соответствующие значения Мар!е должны быть типа асс[па, содержащие только один символ. 0 агстпе[асл саяе! — строка символов, которая в С представляется массивом символов, но с ней можно манипулировать как единым целым. Параметр кеп саят определяет длину строки (количество содержащихся в ней символов), и если задан, то соответствует строке С фиксированной длины. Если он опушен, то внешняя процедура ожидает получения строки переменной длины. Соответствующие значения Мар!е должны быть типа ее?тая или 5!ааьО1.
Ддя описания массива — сложного типа, предназначенного для хранения однотипных простых данных и предоставляющего доступ к ним с помощью индексов, — применяется дескриптор следующего вида: Аяялу[разм1, ..., разия, дескриптор данных, опции[ Каждый параметр разин, где н — целое число, задается в виде целого диапазона и определяет изменение индекса соответствующего размерения.
Нижняя или верхняя граница любого диапазона может быть именем любого формального параметра вызываемой внешней процедуры. В этом случае границы изменения индекса будут установлены во время выполнения процедуры. Параметр дескриптор данных описывает тип данных, содержащихся в массиве, и может быть любым типом, используемым в конструкторах лггау, маегьх или чесеог соответствующих типов Мар1е: тпгедег[п1, ь~еас[п1 и сеер1еа [а!.
Здесь и является целым числом, определяющим требуемое для хранения каждого элемента массива количество байтов оперативной памяти. Опции задают ряд соглашений относительно массива и соответствуют допустимым опциям конструктора яссау[! в Мар1е с единственным исключе- 342 Часть 1 Основы Мар(е нием для опции, определяющей индексную функцию, которая инициализирует элементы массива. Ее следует задавать в виде 1пс(гп. Кроме стандартных опций конструктора актах(( можно использовать две лополнительные опции — сорх и но сорт, которые определяют, будет ли передаваться во внешнюю процедуру копия массива или не будет.
Структура представляет коллекцию не однотипных данных. Ее дескриптор выглядит следующим образом: ятизст(поле1::дескриптор данных1, ..., пелен::дескриптор данныхя,' Каждая пара поле:: дескриптор дан описывает соответствующее поле структуры. Объединение похоже на структуру за исключением того, что все поля используют одну и ту же область памяти.