
- •Управление векторами и матрицами
- •Компиляция и выполнение Компиляция
- •Связывание (редактирование связей )
- •Выполнение
- •Примеры
- •Соглашения о записи кода
- •Арифметические выражения
- •Операции отношения
- •Логические выражения
- •Сравнение символов
- •Переносимость результата
- •Спецификация массивов
- •Сечения массива Индивидуальные элементы
- •Сечения
- •Векторные указатели
- •Память для массива Физическая память:
- •Присваивание массива Присваивание всего массива
- •Присваивание секции (вырезки) массива
- •Повторная нумерация
- •Основные встроенные процедуры
- •Массивы нулевого размера
- •Массивы и производные типы
- •Инициализация массивов Конструкторы
- •Оператор data
- •Встроенные функции для массива
- •Пример упрощения
- •Пример исследования (запроса)
- •Пример конструирования
- •Пример локализации
- •Я Операторы управления
- •Вложения
- •Порядок операторов
- •Синтаксис программы Main
- •Формат представления программы
- •Программные единицы
- •Уровни доступа
- •Дополнения
- •Спецификация входных-выходных параметров
- •Использование модуля
- •Родовые подпрограммы
- •Интерактивный ввод-вывод
- •Простой Input и Output
- •Форматирование по умолчанию
- •Форматированный ввод-вывод I/o
- •Дескрипторы редактора
- •Вещественные - форма с фиксированной точкой
- •Вещественные - экспотенциальная форма
- •Символьные
- •Логические
- •Заполнение пробелами (пропуск символьных позиций)
- •Специальные символы
- •Списки ввода-вывода
- •Производные типы данных
- •Неявный цикл do
- •Ввод-вывод без продвижения
- •Файловый ввод-вывод
- •Номера устройств
- •Операторы read и write
- •Оператор write
- •Оператор open
- •Оператор close
- •Оператор inquirе
- •Динамический массив
- •Распределяемые массивы
- •Спецификация
- •Выделение и возвращение памяти
- •Статус распределяемых массивов
- •Потоки памяти (куча)
- •Что есть указатели?
- •Указатели и адресаты
- •Спецификации указателя Общая форма для операторов определения указателя и адресата такая:
- •Присваивание указателя
- •Разыменование (Dereferencing)
- •Статус (состояние) связи указателя
- •Динамическая память
- •Общие ошибки
- •Указатели в производных типах данных
- •Связанные списки
- •Параметры - указатели
- •Функции для указателей
Fortran 90
ANSI Standard
Fortran 90 является развитием языка Fortran 77, так что программа, написанная на Fortran 77, может быть скомпилирована и запущена как программа на Fortran 90. Стандарт Fortran 90 Standard вводит много новых средств для операций над массивами, новые методы спецификации точности, свободный формат исходного кода, рекурсию, динамические массивы и т.д.. Несмотря на то, что весь Fortran 77 включен в Fortran 90, новый стандарт ANSI предполагает, что некоторые средства из Fortran 77 'потеряют ценность'. Потеряют ценность средства, подобные классифицируемым как 'устаревшие' в последовательности ревизий и переносимые в будущие версии языка Fortran.
Программы на текущем языке стандарта Fortran 77 могут успешно компилироваться компиляторами Fortran 90 без каких-либо изменений. Тем не менее структура программы на языке Fortran 90 может значительно отличаться от структуры эквивалентной программы на Fortran 77. Программист должен остерегаться смешения двух стилей.
В такой же мере компилятор с Fortran 90 требует обеспечения объяснений для сообщений о некоторых кодах несоответствия (несогласования), то есть использование операторов или переменных, которые разрешены сверх множества правил, выходящих за пределы стандарта.
Это поможет программисту написать правильный код.
Как уже упомянуто, Fortran 90 добавляет к Fortran 77 небольшими средствами преимущества новых вычислений , в частности такого развития как новых важных динамических структур данных введения в параллельные архитектуры
Объектно-ориентированные средства
Fortran 90 имеет такие Объектно-ориентированные средства как:
•абстрактные типы данных -- типы, определенные пользователем;
•закрытие данных -- атрибуты PRIVATE и PUBLIC ;
•инкапсуляция -- средства модулей и закрытых данных;
•наследование и расширение – супертипы, оператор перекрытия и родовые процедуры;
•полиморфизм -- пользователь может перекрывать ее с помощью перегрузки родовых программ;
•повторное использование - через модули;
Краткий обзор
наиболее важных средств Fortran 90
(материал взят из проекта Lahey: http://www.lahey.com/index.html, http://www.lahey.com/other.htm).
Средства расширения языка Структуры и производные типы Указатели Объявления свойств Семейство типов Конструкторы Управление программой DO / END DO DO WHILE Конструкция CASE CYCLE, EXIT Массивы Управление векторами и матрицами Выражения для массивов Распределяемые (динамические) массивы Автоматические массивы Секция (вырезка) массива Конструкция WHERE |
75 новых встроенных функций: Манипуляции над битовыми Строковые переменные
Модули и процедуры Интерфейсы Внутренние процедуры Рекурсия Необязательные параметры и ключевые слова Другие средства Стандартная форма исходного текста Свободная форма исходного текста Длинные имена Включение файлов Операции отношения Комментарий в конце подпрограммы Fortran 90 в Lahey |
Возможности расширения языка
Новый язык содержит возможности для пользователя расширять его собственными понятиями, например, для интервальной арифметики, арифметики рациональных или динамических символьных строк. Путем определения новых типов данных или операторов, и перегружаемых операций и процедур (так что вы можете использовать плюс + как символ сложения интервалов, а не только для обычных чисел), мы можем создать пакет (модуль) без использования препроцессора. Мы можем в скором времени ожидать число расширений для различных приложений в форме модулей от различных производителей. Некоторые уже доступны в 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 делает обязательным для всех объектов данных явное объявление.
з
Управление программой
Программа на FORTRAN 77 была часто спроектирована по блок-схеме. Этот вид проектирования ведет естественно к коду, составленному из фрагментов проверки и ветвления программ, он будет труден для внесения изменений, в частности для увеличения размера программы, он потребует большой отладки и в нем будет очень мало повторного использования. Новые методы проектирования программ включают декомпозицию больших проблем на малые проблемы до тех пор, пока решения не станут тривиальными. Новый стандарт Fortran 90 предоставляет конструкции управления, которые делают более легкими реализацию новых методов проектирования программного обеспечения.
В язык включены три новые конструкции для записи цикла.
з
DO / END DO*
END DO заменяет традиционный помеченный оператор завершения CONTINUE для цикла DO. При этом метка в операторе DO не обязательна.
Ниже приводится пример бесконечного цикла, который может быть закончен условным оператором GOTO.
name: DO
выполняемые операторы
END DO name
Обычный оператор цикла DO имеет следующую новую упрощенную форму без номера оператора,
name: DO i = целое_выраж_1, целое_выраж_2 , целое_выраж_3
выполняемые операторы
END DO name
где i так называемая управляющая переменная, и где целое_выраж_3 необязательно.
з
DO WHILE*
Оператор обеспечивает повторение блока до тех пор, пока условие верно.
name: DO WHILE (логическое_выражение)
выполняемые операторы
END DO name
Имя здесь не обязательно, но может быть использовано для следующих циклов в целях индикации, когда нужны итерации, с операторами завершения CYCLE или EXIT.
S1: DO
IF (X Y ) THEN
Z = X
EXIT S1
END IF
CALL NEW(X)
END DO
N = 0
LOOP1: DO I = 1, 10
J= I
LOOP2: DO K =1, 5
L = K
N = N +1
END DO LOOP2
END DO LOOP1
В последнем случае конечные значения переменных будут следующими, в полном соответствии со стандартом, I = 11, J = 10, K = 6, L = 5, и N = 50.
Именовать цикл не обязательно. Заметим, что этот тип имени ограничивает конструкции цикла DO, CASE или IF...THEN...ELSE...ENDIF. Старые возможности с номерами операторов все еще допустимы , также и в свободной форме.
з
Конструкция CASE *
Заменяет запутанную конструкцию IF/ELSE IF или вычисляемые GO TO. Делает код более легким для понимания и для записи.
Новая команда такова
SELECT CASE (выражение)
CASE блок-переключатель
блок
CASE блок-переключатель
блок
CASE DEFAULT
блок по умолчанию
END SELECT
Типичная конструкция:
SELECT CASE(3*I-J) ! управляющая переменная это 3*i-j
CASE(0) ! для значения нуль
: ! вы вычисляете код здесь
CASE(2,4:7) ! для значений 2, 4, 5, 6, 7
: ! вы вычисляете код здесь
CASE DEFAULT ! и для всех остальных значений
! вы вычисляете код здесь
: !
END SELECT
Если CASE DEFAULT отсутствует и не находится альтернатива, вычисление продолжается прямо с оператора, за END SELECT без выдачи сообщения об ошибке. Другой пример:
INTEGER FUNCTION SIGNUM(N)
SELECT CASE (N)
CASE (:-1)
SIGNUM = -1
CASE (0)
SIGNUM = 0
CASE (1:)
SIGNUM = 1
END SELECT
END
! Еще один пример использования конструкции CASE
! (c)Copyright 1993, Lahey Computer Systems, Inc. All RIGHTS RESERVED
! Test: case1
!
! Legal - все возможные типы case-значение-диапазон для integer*4
!
integer*4 i
integer n /9/, a (9) /1,-11,81,31,41,51,61,71,25/
do 50 j = 1, n
i = a (j)
select case ( i )
case (1)
print*,"should be 1, is ",i
case ( : -11 )
print*,"should be 11 or less, is ",i
case ( 81 : )
print*,"should be 81 or greater, is ",i
case ( 31 : 32 )
print*,"should be 31 or 32, is ",i
case ( 41, 50:51, 61 :61, 71:72 )
print*,"should be 41, 50, 51, 61, 71, or 72, is ",i
case default
print,"should be any other number, is ",i
end select
50 continue
end
з
CYCLE, EXIT*
Прерывает отдельную итерацию цикла DO или весь цикл прежде чем завершится повторяемый блок. Уменьшает потребность в GO TO.
з
Конструируирование имен Names
Вы можете конструировать метки для IF, DO, и CASE, чтобы сделать код более читаемым и возможными CYCLE или EXIT к внешним уровням следующих циклов.
з
Массивы
Управление векторами и матрицами
Это одна из самых важных частей нового стандарта. Определение массива порождает образ (shape), задаваемый числом его измерений (рангом) и протяженностью по каждому измерению. Два массива соответствуют друг другу, если они имеют один и тот же образ. Операции как правило поэлементные. Ранг массива не есть ранг матрицы в математическом смысле!
REAL, DIMENSION(5,20) :: x, y
REAL, DIMENSION(-2:2,20) :: z
:
z = 4.0*y*sgrt(x)
REAL, DIMENSION(6) :: B
REAL, DIMENSION(2,3) :: C
B = (/ 1, 1, 2, 3, 5, 8 /)
C = RESHAPE( B, (/ 2,3 /) )
где первый аргумент встроенной функции RESHAPE дает значение, а второй аргумент дает новый образ. Два дополнительных, но необязательных аргумента возможны у этой функции.
Вышеприведенное можно записать более кратко с помощью атрибута PARAMETER. В первой строке ниже атрибут PARAMETER принудительный (если присваивание может быть выполнено в этой самой строке), но во второй строке он не обязателен. Атрибут PARAMETER означает, что неизвестное может не быть заменено во время выполнения программы.
REAL, DIMENSION(6), PARAMETER :: B = (/ 11, 12, 13, 14, 15, 16 /)
REAL, DIMENSION(2,3), PARAMETER :: C = RESHAPE( B, (/ 2, 3 /) )
Некоторые операторы для реальных параллельных вычислений не включены в Fortran 90. См. HPF.
з
Выражения для массивов
Компилируемый цикл DO может быть теперь свернут в один оператор. Используем целиком массивы в выражениях или как аргументы встроенных функций.
! Пример программы, использующей атрибуты внутри типа stmt, и выражение для массива.
program main
! Объявляем dim1 как parameter, со значением 5.
integer, parameter :: dim1=5
! Объявляем res, x, & y как 5-элементные массивы, и инициализируем x & y.
real, dimension(dim1) :: res, x=(/1.,2.,3.,4.,5./),y=(/5.,4.,3.,2.,1./)
! Прибавим соответствующие элементы из x & y, и присвоим res.
res = x + y
! Все элементы из res будут равны 6.
write(*,10) res
10 format(1x,5(f3.0,4x))
end program
з
Распределяемые (динамические) массивы *
Память для массивов может распределяться во время выполнения.
Fortran 90 содержит четыре различных способа для обеспечения динамического доступа. Первый путь - использование указателей для вектора и матрицы.
Второй способ - использование распределяемого массива, то есть с помощью операторов ALLOCATE и DEALLOCATE вы получаете и возвращаете область памяти для массива с типом, образом и именем (и возможно и другими атрибутами), которая специфицирована заранее с дополнительным атрибутом ALLOCATABLE.
REAL, DIMENSION(:), ALLOCATABLE :: x
:
Allocate(x(N:M)) ! N и M целые выражения.
:
x(j) = q ! Некое присваивание массива.
CALL sub(x) ! Использование массива в подпрограмме.
:
DEALLOCATE (x)
Освобождение происходит автоматически (если атрибут SAVE не был задан), когда достигается RETURN или END в этой программной единице.
Третий вариант - это автоматический массив, это почти такой же как в старом Fortran, где x в примере ниже может быть в списке аргументов. Этого больше не требуется. (см. ниже).
SUBROUTINE sub (i, j, k)
REAL, DIMENSION (i, j, k) :: x
Размеры для x задаются целыми величинами в вызове программы.
Наконец "массив с неявным образом", где память определена в вызове процедуры и для которой даны только тип, ранг и имя.
SUBROUTINE sub(a)
REAL, DIMENSION (:,:,:) :: a
Заметим, что в одном из примеров компилятор на Alfa не передал образ в подпрограмму.
з
Неявный массив образов (форм)
Формальные массивы могут взять форму своего образа (своей формы) из соответствующих фактических параметров (см. замечание выше).
з
Автоматические массивы
Массивы в процедуре имеют размеры, определяемые значениями переменных.
! Пример использования автоматических и неявных образов массивов
program main
integer :: dim=8
real :: a(4)=(/44.3,77.5,88.21,14.35/)
call sub1(a,dim)
end program
subroutine sub1(x,dim1)
integer dim1
real x(:), b(dim1) ! Объявляет 'x' с тем же самым образом как у фактического аргумента 'a'
.
. ! Объявляет 'b' с 'dim1' элементами.
.
end subroutine sub1
з
Секция (вырезка) массива
Вы можете указать часть массива. Допустим, массив A специфицирован следующим образом
REAL, DIMENSION(-4:0, 7) :: A
Тогда A(-3, :) указывает второй ряд матрицы, тогда как A(0:-4:-2, 1:7:2) указывает (в обратном порядке) каждый второй элемент в каждой второй колонке. Так же как переменные могут образовывать массивы, так и константы могут образовывать массивы .
Вырезки позволяют пользователю получить большее управление массивом путем использования тройки индексов и векторных индексов..
з
Конструкция WHERE
Конструкция позволяет задавать условия выполнения действий над массивами.
В следующем примере мы хотим защититься от отрицательных элементов X. Это задано следующей конструкцией
WHERE ( x = 0.0 )
z = 4.0*y*sgrt(x)
ELSEWHERE
z = 0.0
END WHERE
Заметьте, что ELSEWHERE записано одним словом! Сравните с функцией SUM (конец следующей секции.
Сумма положительных значений членов массива записана и так
SUM ( X, MASK = X .GT. 0.0)
Такой оператор не может быть использован для того, чтобы избежать деления на ноль в случае суммирования 1/X, что есть слово-маска для определения, какие номера включены в суммирование, и либо ни одно из двух определенное значение не может быть вычислено или нет. Но в последнем случае Вы можете использовать конструкцию WHERE.
Присваивание маскированного массива позволяет пользователю сделать присваивание , базирующееся на маске по всему массиву.
! Пример использования распределяемого массива и конструкции where.
program main
integer number_of_students, number_of_tests
! Объявление массива 'scores' и 'letter_grade' как распределяемых allocatable и 2 мерные.
integer, allocatable, dimension(:,:) :: scores
character(len=1), allocatable, dimension(:,:) :: letter_grade
open(unit=1,file='grades',form='formatted',access='sequential')
read(1,10) number_of_students, number_of_tests
! Распределение памяти для массивов.
allocate (scores(number_of_students,number_of_tests))
allocate (letter_grade(number_of_students,number_of_tests))
read(1,10) ((scores(i,j),i=1,number_of_students), j=1,number_of_tests)
close(1)
! Используется конструкция where для присваивания значений массиву 'letter_grade' ,
! основанному на значениях массива 'scores'.
where(scores >= 90) letter_grade = 'A'
where(scores >= 80 .and. scores < 90) letter_grade = 'B'
where(scores >= 70 .and. scores < 80) letter_grade = 'C'
where(scores >= 60 .and. scores < 70) letter_grade = 'D'
where(scores < 60) letter_grade = 'F'
write(*,*) letter_grade
deallocate(scores,letter_grade) ! Освобождение памяти, использованной массивами.
10 format(i3,t5,i3)
end program
з
Встроенные
В Fortran 90 включены 75 новых встроенных функций:
В другом руководстве сказано, что Fortran 90 включает около 100 встроенных функций и очень много встроенных подпрограмм. Ряд функций позволяет иметь определенными атрибуты и допустимые параметры среды программирования, такие как наибольшее положительное число целое и с плавающей запятой, как доступ к системным часам. Включен генератор случайных чисел.
Все встроенные функции и подпрограммы описываются в соответствующем разделе.
Функция Inquiry
Находит в программе во время выполнения характеристики массива или статус указателя. Находит в компиляторе характеристики типа данного.
Функция Transfer
Функция TRANSFER рассматривает сущность одного данного так, как если бы оно было типом другого данного. Она позволяет определенную физическую область передать другой области без конверсии типа.
Array Intrinsics
Различные новые функции уменьшения (преобразования) массива (например, SUM), перемножение векторов и матриц, конструирование массива (SPREAD), преобразование образа, сдвиг, транспонирование (TRANSPOSE), и указание значений максимума и минимума.
Функция SPREAD обсуждается более полно в решении примера (11.1). см.Summary.
Границы массива
Некоторые встроенные функции достаточны, чтобы определить фактические границы массива по измерениям.
DO (i = LBOUND(a,1), UBOUND(a,1))
DO (j = LBOUND (a,2), UBOUND (a,2))
DO (k = LBOUND(a,3),UBOUND (a,3))
где LBOUND дает нижнюю границу размерности и UBOUND дает ее верхнюю границу.
з
Манипуляции над битовыми*
Установка, очистка, тестирование и сдвиг битов в целых данных. Выполняют логические AND, OR, исключающее OR и дополнение.
Тип данных "bit" не включен в стандарт, но имеются допустимые варианты битовых операций над целыми согласно более ранним military стандартом MIL-STD 1753. Дополнительно включены битовые, восьмеричные и шестнадцатиричные константы, так же возможность использовать их в операциях ввода/вывода с помощью трех новых спецификаций формата. В операторе DATA вы можете использовать присваивание.
B'01010101010101010101010101010101'
для битовых,
O'01234567'
для восьмеричные и
Z'ABCDEF'
для шестнадцатиричных чисел.
з
Строковые переменные
Величины CHARACTER могут быть расширены до включения пустой строки
a = ''
и присваивание частично перекрывающихся строк теперь разрешено
a(:5) = a(3:7)
Новая встроенная функция TRIM, удаляющая заключительные пробелы, является важным добавлением. Вы можете теперь делать выбирать между апострофом ' и двойной кавычкой " в качестве ограничителя строки. К числу тех же средств относится возможность использования двойной кавычки для представления апострофа внутри строки.,и использования апострофа для представления двойной кавычки внутри строки.
------------------------------------------------------------------------
з
Модули и процедуры
Модули это коллекции данных, определений типов определений процедур, которые дают большую защищенность и общее замену понятия COMMON.
Модули занимают важное место в том, чтобы положить вещи для совместного использования. Этот новый вариант программной единицы может содержать данные, процедуры, определения производных типов и блоки интерфейса (и даже блоки common), все, что может быть включено в единицу scoping с посощью оператора USE. Модуль может также быть использован в скрытом коде процедуры от клиентов . Один и тот же модуль может быть использован во многих программах.
з
Интерфейсы
В соответствии с предложениями Metcalf и Reid (1990, 1992) в Фортран 90 введено требование явного интерфейса. Он выглядит так
INTERFACE
SUBROUTINE SUB(A)
REAL, DIMENSION (:,:,:) :: A
END SUBROUTINE SUB
END INTERFACE
Если Вы забыли INTERFACE или если Вы имеете ошибочный интерфейс, то Вы обычно получаете "ошибку сегментации", это означает, что программная единица может быть отсутствует.
Компилятор может быть использован для проверки результатов если характеристики процедур доступны в явном интерфейсе. Тело интерфейса, определенного пользователем, выглядит очень похоже на оператор определения функции и ассоциируется с определениями. Компилятор знает интерфейс с каждой определенной процедурой внутри программной единицы. С интерфейсом компилятор будет проверять характеристики результата функций, с которым ожидаются при вызове и проверке характеристик каждого аргумента с которыми ожидается процедура.
Программисты общих (родовых) процедур могут использовать общие процедуры (процедуры с одним и тем же имененм) с помощью использования интерфейсного блока, чтобы проверить информацию для определения, какую процедуру вызвать. Специальная процедура чтобы быть вызываемой, использующая вид, тип и ранг (категорию) аргументов.
! Пример использования общих процедур
module procedure_def
! Опрелить общий интерфейс 'force' для специальных функций
! 'real_force' and 'double_force'.
interface force
! Объявляет функции и подставляемые типы аргумента.
function real_force(mass, accel) result(force)
real force, mass, accel
end function real_force
function double_force(mass, accel) result(force)
double precision force, mass, accel
end function double_force
end interface
end module
program main
use procedure_def ! Ассоциирует procedure_def с main.
real rmass, raccel, rforce
double precision dmass, daccel, dforce
data rmass/2401.0/, raccel/9.81245/
data dmass/2401.0d0/, daccel/9.81245d0/
! Вызывает функцию 'force'. Компилятор реализует первый
! в 'real_force', и второй в 'double_force'.
rforce = force(rmass, raccel)
dforce = force(dmass, daccel)
write(*,'(1x,1p,e16.9,t25,d16.9)') rforce, dforce
end program
! Фактические функции выполняемы, когда сделан вызов 'force'.
function real_force(mass, accel) result(force)
real force, mass, accel
force = mass*accel
end function real_force
function double_force(mass, accel) result(force)
double precision force, mass, accel
force = mass*accel
end function double_force
з
Внутренние процедуры
Внутренние процедуры делают более легкой организацию кода, который использован только в одном месте и уменьшает число внешних подпрограмм, которые необходимо знать программисту. Программная единица и процедуры модуля могут содержать свои собственные внутренние подпрограммы и функции. Интерфейс этих внутренних процедур известен из содержащую программную единицу.
з
Рекурсия*
Рекурсия стандартизована в 90. Если процедура должна вызываться рекурсивно, даже косвенно, это должно быть объявлено ключевым словом RECURSIVE . Например,
RECURSIVE FUNCTION factorial (n) RESULT (fac)
Должна иметь возвращаемый результат, когда задано имя величины со спецификацией RESULT.
з
Параметры необязательные и ключевые слова
Подпрограммы могут вызываться с параметрами, сопровождаемыми ключевыми словами, можно использовать параметры по умолчанию
SUBROUTINE solve (a, b, n)
REAL, OPTIONAL, INTENT (IN) :: b
Может быть вызвана с помощью оператора
CALL solve (n = i, a = x)
Где два аргумента заданы с ключевыми словами вместо позиционных и где один из трех имеет значение по умолчанию.
Если SOLVE внешняя подпрограмма, то она требует использования блока INTERFACE в вызывающей программе.
Как видно из приведенного, необязательные аргументы с ключевым словом добавляются свободно при вызове подпрограммы или функции. В FORTRAN 77, Вы были обязаны указывать каждый аргумент. В Fortran 90, аргументы могут быть необязательными и их порядок произволен. Имена подставляемых аргументов (аргументов с ключевыми словами) - те, которые использованы в вызове процедуры для разрешения связей между фактическими и подставляемыми аргументами. Новые встроенные функции позволяют процедуре определить, какие аргументы представлены в списке фактических аргументов.
з
Ввод
В Фортране 90 оператор NAMELIST может использоваться среди спецификаций. В примере ниже list2 это имя списка, a и b переменные типа real, i переменная типа integer .
NAMELIST /list2 / a, i, x
:
READ (unit, NML = list2)
которым нужно передать исходные данные следующего вида, но все переменные не могут быть заданы и он могут быть заданы в любом порядке.
&list2 X = 4.3, A = 1.E20, I = -4 /
------------------------------------------------------------------------
з
Другие средства
Стандартная форма исходного текста
Комметарии вводятся с помощью восклицательного знака. Множество операторов на одной строке разделяются с помощью точки с запятой ;
з
Свободная форма исходного текста
Колонки не имеют никакого особого значения, важны пробелы, продолжение специальный символ в конце строки, комментарии вводятся в любой строке с помощью восклицательного знака. Множество операторов на одной строке разделяются с помощью точки с запятой ; . . Строка продолжения начинается с симоала & (амперсанд).
Строки могут иметь более 132 символов, позволяются более длинные имена и более
абзацные отступы для удобства чтения.
з
Длинные имена *
Максимальная длина 31 символ в обеих формах. Символы подчеркивания внутри имени разрешены.
з
Включение файлов *
Строка INCLUDE стандартизована.
INCLUDE может быть использовано для включения из внешнего вида. Указывается полное имя файла, включаемого в фортран-программу. Рекурсия для оператора INCLUDE не разрешена.
з
Операции отношения *
Операции, подобные .LT. и .GT. могут быть заменены их математическими символами < и >, а также.
< .LT. > .GT.
<= .LE. >= .GE.
== .EQ. /= .NE.
Пробел - значимый символ
Пробел в свободной форме записи является значимым символом. Команды, подобные ENDIF и GOTO могут быть записаны как END IF или GO TO, но не EN DIF или GOT O. Чтобы допустить значимые пробелы в старой (фиксированной ) форме исходного кода не будет возможно, в этом случае допустимо написать END в следующем виде
E N D
з
Комментарий в конце подпрограммы
Как во многих типах алголо-подобных языков слово END может быть составлено с именем подпрограммы или функции, например, END FUNCTION GAMMA.
з
Fortran 90 в Lahey
Эта система объединяет проект победившего в конкурсе Fortran -компилятора с технологией фирмы Intel для построения высоко оптимизированного кода. Она оптимизирована для 386, 486, Pentium PC и полной реализации стандарта Fortran 90.
Более подробная информация
Если Вы заинтересованы в более глубоком и детальном знании Fortran 90, авторы рекомендуют переход на Fortran 90 Джеймса Кернигана (James Kerrigan). Вы можете купить эту книгу прямо у нас за $27.95 плюс $3.00 пересылка и вручение. REFERENCES Adams, Jeanne C., Walter S. Brainerd, Jeanne T. Martin, Brian T. Smith, and Jerrold L. Wagener. Fortran 90 Handbook. New York: McGraw-Hill, 1992. Baker, Steven. "Modernizing Fortran." Software Development November 1993, International Standards Organization, ISO/IEC 1539: 1991 (E). The International Fortran Standard. Kerrigan, James F. Migrating to Fortran 90. Sebastopol: O'Reilly & Associates, 1993. Metcalf, Michael and John Reid. Fortran 90 Explained. New York: Oxford University Press, 1990. *These features are already contained in Lahey's FORTRAN 77 language sytems, F77L and F77L-EM/32
.
Описание Фортрана 90 разбито на разделы:
О компиляции с языка Фортран 90 (compilat_rus.html) Соглашения о кодировании Объекты данных Переменные Спецификации или объявления Виды KIND Арифметические операторы Комментарии Символьный тип Производные типы данных Операции отношения Логические выражения Сравнение символов Массивы (термины) Спецификации массива Вырезки (Сечения) массива Векторные указатели Память для массивов Присваивание массивов Массивы нулевого размера Массивы переменных типов Инициализация массивов Оператор WHERE Встроенные функции для массивов Условные операторы Операторы управления Циклы |
Вложенность конструкций Структура программы Порядок операторов Синтаксис программы Main Формат размещения программы Программные единицы Процедуры Родовые единицы Модули Ввод-вывод Интерактивный ввод-вывод Простой ввод-вывод Форматированный ввод-вывод Редактирование ввода-вывода Оператор Namelist Списки ввода-вывода Ввод-вывод без продвижения Файловый ввод и вывод Номер устройства Операторы READ and WRITE Оператор OPEN Оператор CLOSE Оператор INQUIRE Память для массивов Динамические массивы Распределяемые массивы Указатели для массивов Еще примеры |