![]() | |||||
|
|
Теория: Обзор наиболее важных средств Fortran 90Возможности расширения языкаНовый язык содержит возможности для пользователя расширять его собственными понятиями, например, для интервальной арифметики, арифметики рациональных или динамических символьных строк. Путем определения новых типов данных или операторов, и перегружаемых операций и процедур (так что вы можете использовать плюс + как символ сложения интервалов, а не только для обычных чисел), мы можем создать пакет (модуль) без использования препроцессора. Мы можем в скором времени ожидать число расширений для различных приложений в форме модулей от различных производителей. Некоторые уже доступны в NAG. Структуры (производные типы)В Фортран раньше не разрешалось использование некоторых типов, определенных пользователем. Теперь это можно делать Вы можете группировать Ваши данные, используя производные типы. При этом можно комбинировать встроенные типы (включая массивы и указатели). Доступ к компонентам новых типов осуществляется использованием уточнителя, а в качестве разделителя в нем знак процента. (Производные типы известны в VAX Fortran как записи.) Ниже приведен пример
TYPE staff_member
CHARACTER(LEN=20) :: first_name, last_name
INTEGER :: identification, department
END TYPE
который может быть использован для того, чтобы описывать отдельные единицы. Комбинация индивидуальных единиц может создана таким образом TYPE(staff_member), DIMENSION(100) :: staff Отдельная единица может быть вызвана как staff(number), а поле может быть вызвано как staff(number)%first_name. Вы можете образовать гнездо определений
TYPE company
CHARACTER(LEN=20) :: company_name
TYPE(staff_member), DIMENSION(100) :: staff
END TYPE
:
TYPE(company), DIMENSION(10) :: several_companies
Значительно более интересный пример - это разреженная матрица A, имеющаяс более сотни ненулевых элементов, которая может быть специфицирована следующим оператором
TYPE NONZERO
REAL VALUE
INTEGER ROW, COLUMN
END TYPE
и
TYPE (NONZERO) :: A(100)
Вы тогда получаете значение A(10), записав A(10)%VALUE. Присваивание может быть записано как A(15) = NONZERO(17.0,3,7) Для того, чтобы использовать в COMMON определенные пользователем в примере типы, или чтобы безусловно сделать так, чтобы два типа данных, которые выглядят как один и тот же, рассмотривались как идентичные, вы можете использовать оператор SEQUENCE, в последнем случае требуется , чтобы переменная была специфицирована как PRIVATE. ! Еще один пример, использующий производные типы и модули module pipedef type pipe ! определяется новый тип 'pipe', который real diameter ! включает две компоненты типа reals, real flowrate ! компоненту типа integer ! и компоненту типа character. integer length character(len=10) :: flowtype end type pipe end module pipedef program main use pipedef ! Связывает с модулем pipedef программу main. type(pipe) water1, gas1 ! объявляет две переменные типа 'pipe'. water1 = pipe(4.5,44.8,1200,"turbulent") ! присваивает значение переменной water1. gas1%diameter = 14.9 ! присваивает значение gas1%flowrate = 91.284 ! частям переменной gas1. gas1%length = 2550 gas1%flowtype = 'laminar' . . end program УказателиУказатели позволяют программе вызвать более одной области памяти с одним именем. По сравнению с указателями языка С указатели в Fortran 90 более ограничены, и поэтому легче для отладки и оптимизации. Объекты данных с атрибутами-указателями могут иметь ассоциированную с ними память, выделяемую и возвращаемую, которую можно использовать динамически. Указатели могут быть ассоциированы с другими указателями и с другими объектами, облегчая работу с такими структурами данных как списки и деревья. Вид семействаТип семейства дает возможность пользователю запросить, какой встроеннный тип использован базовым для точности и диапазона значений. Это средства среду вычислений. Программисты, которые адресуют свои программы разным машинам, должны иметь дело с различным числом точных цифр. Используя семейство (kind), программист может специфицировать требуемую числовую точность. ! Пример, использующий атрибут KIND и функцию KIND . ! Этот пример потребует от компилятора ! символьный тип данных kind(2) ! Это допустимо в F90, но не обязательно. program main integer, parameter :: kanji_char_kind = 2 ! Используем атрибут kind, чтобы определить известный kind. character(kind = kanji_char_kind, len=20), dimension(20) :: name ! Используем функцию kind, ! чтобы определить kind из объекта известного kind. real(kind = kind(0.0d0)) :: pi=3.14159265359d0 open(unit=1, file='names', form='formatted', access='sequential') read(1,10) (name(i), i=1,20) write(*,20) name write(*,30) pi close(unit=1) 10 format(a20) 20 format(1x,t7,a20,t30,a20,t55,a20) 30 format(1x,1p,d18.11) end program Объявления (декларации, спецификации)Объекты данных могут иметь комбинацию 12 различных атрибутов, таких как POINTER, SAVE, и т.д. Fortran 90 вводит "объектно-ориентированные " объявления, в которых объекты с одинаковыми комбинациями атрибутов могли быть декларированы со всеми их атрибутами в одном операторе. В одной строке могут теперь быть записаны:
REAL, DIMENSION (3), PARAMETER :: &
a = (/ 0.0, 0.0, 0.0 /), b = (/ 1.0, 1.0, 1.0 /)
COMPLEX, DIMENSION(10) :: john
Тогда как переменные a и b задают константный вектор из 3 элементов и значения с плавающей точкой 0.0 и 1.0, соответственно, в то время как john задается как вектор типа complex из 10 элементов типа complex, все еще не присвоены значения ни одной переменной. Двойная точность может быть реализована более общим методом, чтобы дать настраиваемую точность, даваемую параметром KIND, для которого точность мы определим полностью для всех типов переменных.
INTEGER, PARAMETER :: LP = SELECTED_REAL_KIND(20)
REAL (KIND = LP) :: X, Y, Z
Выше приведенные операторы объявляют переменные X, Y и Z как REAL с плавающей точкой с числом десятичных цифр, меньшим 20 с типом данных, называемым LP (где LP стандартное сокращение для LONG PRECISION). КонструкторыМассив и объекты производных типов данных могут быть инициализированы в операторе объявления. Конструктор может быть использован как константа там, где ожидается массив или производный тип. IMPLICIT NONE*Если Вы хотите использовать алгол-принцип спецификации всех переменных, это достигается командой IMPLICIT NONE с явными описаниями типа. Эта стандартизация популярного расширения F77 делает обязательным для всех объектов данных явное объявление. |
||||
![]() | Copyright © fortran-online.info, 2007 | ||||