Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
современный фортран , Бортеньев.pdf
Скачиваний:
242
Добавлен:
26.03.2015
Размер:
2.34 Mб
Скачать

О. В. Бартеньев. Современный ФОРТРАН

3.2. Операторы объявления типов данных

3.2.1. Объявление данных целого типа

Оператор INTEGER объявляет переменные, константы, функции целого типа. Объекты данных целого типа могут быть заданы как INTEGER, INTEGER(1), INTEGER(2) или INTEGER(4). Можно использовать и принятый в Фортране 77 синтаксис: INTEGER*1, INTEGER*2 или INTEGER*4.

Напомним, что указанные в скобках значения задают разновидность типа, значения после звездочки - число отводимых под тип байт. Задаваемую по умолчанию разновидность стандартного целого типа данных INTEGER можно изменить, используя опцию компилятора /4I2 или директиву $INTEGER:2.

Синтаксис оператора INTEGER:

INTEGER [[([KIND =] kind-value)][, attrs] ::] entity-list

kind-value - значение параметра разновидности KIND. В качестве kindvalue может быть использована ранее определенная именованная константа. attrs - один или более атрибутов, описывающих представленные в entity-list объекты данных. Если хотя бы один атрибут указан, то должен быть использован разделитель :: . Возможные атрибуты: ALLOCATABLE, AUNOMATIC, DIMENSION(dim), EXTERNAL, INTENT, INTRINSIC, OPTIONAL, PARAMETER, POINTER, PRIVATE, PUBLIC, SAVE, STATIC, TARGET и VOLATILE (последний атрибут применим только в CVF). Задание атрибутов может быть также выполнено и отдельным оператором, имя которого совпадает с именем атрибута. Атрибуты определяют дополнительные свойства данных и будут вводиться по мере изложения материала. Если задан атрибут

PARAMETER, то необходимо инициализирующее выражение, например: integer(4), parameter :: m= 10, n = 20

entity-list - разделенный запятыми список имен объектов данных (переменных, констант, а также внешних, внутренних, операторных и встроенных функций), содержащий необязательные инициализирующие значения переменных выражения. При этом инициализация может быть выполнена двумя способами:

integer :: a = 2, b = 4

! Наличие разделителя :: обязательно

или

 

integer a /2/, b /4/

! Разделитель :: может отсутствовать

Если параметр KIND отсутствует, то применяемое по умолчанию значение разновидности равно четырем (если не использована опция компилятора /4I2 или директива $INTEGER:2). Значение параметра разновидности можно узнать, применив встроенную справочную функцию

KIND (разд. 6.10).

Диапазон изменения значений целых типов:

50

 

риложение3. Организация данных

BYTE

то же, что и INTEGER(1)

INTEGER(1)

от -128 до +127

INTEGER(2)

от -32,768 до +32,767

INTEGER(4)

от -2,147,483,648 до +2,147,483,647

INTEGER

то же, что и INTEGER(4)

Пример:

integer day, hour

 

 

! Объявление без атрибутов

integer(2) k/5/, limit/45/

 

! Объявление и инициализация

byte vmin = -1

 

 

! То же, что и INTEGER(1)

 

 

 

 

! Объявления с атрибутами

integer, allocatable, dimension(:) :: days, hours

integer(kind = 2), target :: kt = 2

! Объявление и инициализация

integer(2), pointer :: kp

 

 

integer(1), dimension(7) :: val = 2

! Объявление и инициализация

allocate(days(5), hours(24))

 

! Размещение массивов

days = (/ 1, 3, 5, 7, 9/ )

 

! Генерация значений массивов

hours = (/ (i, i = 1, 24) /)

 

! при помощи конструктора массива

day = days(5)

 

 

 

hour = hours(10)

 

 

 

kp => kt

 

 

 

! Присоединение ссылки к адресату

print *, day, hour

 

 

 

print *, kt, kp

 

 

 

print *, vmin, val(5), k*limit, kind(val), range(kp)

end

 

 

 

 

Результат:

 

 

 

9

10

 

 

 

2

2

 

 

 

-1

2

225

1

4

Замечание. Пользуясь синтаксисом Фортрана 77, первые 3 оператора можно объединить, указав размер типа в байтах после имени переменной:

integer day*4, hour*4, k*2 /5/, limit*2 /45/, vmin*1 /-1/

Число, стоящее после звездочки (*), указывает на количество байт, отводимых под переменную заданного типа. Такой способ объявления данных возможен и с другими встроенными типами.

Целая величина может быть в ряде случаев использована там, где ожидается логическое значение (в операторах и конструкциях IF и DO WHILE). При этом любое отличное от нуля целое интерпретируется как истина (.TRUE.), а равное нулю - как ложь (.FALSE.), например:

integer(4) :: i, a(3) = (/ 1, -1, 0 /) do i = 1, 3

if(a(i)) then write(*, *) 'True'

51

О. В. Бартеньев. Современный ФОРТРАН

else

write(*, *) 'False' end if

end do

Результат:

True

True

False

Также целая величина может быть присвоена логической переменной:

logical fl1, fl2

 

fl1 = 5; fl2 = 0

 

print *, fl1, fl2

! T F

Замечание. Смешение логических и целых величин недопустимо, если используется опция компилятора /4Ys или директива $STRICT, при которой все расширения по отношению к стандарту Фортран 90 воспринимаются как ошибки.

3.2.2. Объявление данных вещественного типа

Синтаксис оператора объявления объектов вещественного типа аналогичен синтаксису оператора INTEGER:

REAL [[([KIND =] kind-value)] [, attrs] ::] entity-list

Параметр KIND может принимать значения 4 и 8. Первое значение используется для объявления объектов данных одинарной точности, а второе - для объектов двойной точности. Параметр разновидности может быть опущен. В таком случае принимаемое по умолчанию значение параметра разновидности вещественного типа равно четырем. Разумеется, возможно использование и альтернативного способа объявления данных, например вместо REAL(4) можно использовать REAL*4. Также вещественные данные двойной точности могут быть объявлены оператором DOUBLE PRECISION. Вещественные данные представляются в ЭВМ в виде чисел с плавающей точкой.

Параметром разновидности может также быть именованная константа или возвращаемое функцией KIND значение. Так, объявление

REAL(KIND(0.0)) эквивалентно объявлению REAL(4) или REAL(KIND = 4) (или REAL(8), если задана опция компилятора /4R8). Объявление REAL(KIND(0.0_8)) эквивалентно объявлению REAL(8) или REAL(KIND = 8). Задаваемая по умолчанию разновидность стандартного вещественного типа может быть изменена с 4 на 8 в результате использования опции компилятора /4R8 или директивы $REAL:8.

Диапазон изменения значений вещественных типов:

REAL(4) отрицательные числа: от -3.4028235E+38 до -1.1754944E-38;

52

риложение3. Организация данных

число 0;

положительные числа: от +1.1754944E-38 до +3.4028235E+38;

дробная часть может содержать до шести десятичных знаков. REAL то же, что и REAL(4)

REAL(8) отрицательные числа:

от -1.797693134862316D+308 до -2.225073858507201D-308;

число 0; положительные числа:

от +2.225073858507201D–308 до +1.797693134862316D+308;

дробная часть может содержать до 15 десятичных знаков.

Пример 1:

integer(4), parameter :: m = 3, n = 5, low = 4 real(kind = 4) :: d(m, n) = 15.0, hot = 3.4 real(4), pointer :: da(:, :)

real(low) d2(n)

Пример 2. Атрибут может быть задан в виде оператора.

real(8) :: da

! Объявляем ссылочный массив da

pointer da

! Теперь, используя операторы, зададим атрибуты

dimension da(:, :)

 

parameter m = 10, n = 20

 

allocate(da(m, n))

! Первый исполняемый оператор

3.2.3. Объявление данных комплексного типа

Комплексное число типа COMPLEX или COMPLEX(4) представляет собой упорядоченную пару вещественных чисел одинарной точности.

Комплексное число типа COMPLEX(8) (DOUBLE COMPLEX) -

упорядоченная пара вещественных чисел двойной точности. Например:

complex(4) :: c, z = (3.0, 4.0)

 

 

c = z / 2

!

(1.50000, 2.00000)

Первый компонент пары представляет действительную, а второй - мнимую части числа. Оба компонента комплексного числа имеют одну и ту же разновидность типа.

Синтаксис оператора объявления объектов комплексного типа: COMPLEX [([KIND =] kind-value)] [[, attrs] ::] entity-list

3.2.4. Объявление данных логического типа

Объекты логического типа объявляются оператором

LOGICAL [([KIND =] kind-value)] [[, attrs] ::] entity-list

Разновидность типа может принимать значения 1, 2 и 4 и совпадает с длиной логической величины в байтах. Задаваемую по умолчанию

53