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

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

При задании начальных значений переменных в операторах объявления типа начальное значение переменной следует сразу после объявления этой переменной. Возможно также, как и в случае оператора DATA, использование повторяющихся констант, например:

real a(6, 7) /1, 2, 3, 4, 5, 6, 35*-1/,

&

d /4/, r /6.7/,

 

&

eps /1.0e-8/, cmax /2.4e12/

 

 

character st*6/'Error!'/, chr/'Y'/, sth*20/18hHollerith constant/

integer m /6/, n /7/

! Ошибочна запись: integer m, n/6, 7/

! или, используя синтаксис Фортрана 90:

 

character(len = 6) :: st = 'Error!'

 

 

integer :: m = 6, n = 7

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

Для инициализации переменных в операторах объявления типа могут использоваться конструкторы массивов и структур. Многомерный массив можно сконструировать из одномерного, применив функцию RESHAPE (разд. 4.12.4.3), например:

real(4) :: b(42) = (/ 1, 2, 3, 4, 5, 6, (-1, k = 7, 42) /)

real(4) :: c(6, 7) = reshape((/ 1, 2, 3, 4, 5, 6/ ), shape = (/ 6, 7 /), pad = (/ -1 /))

3.8. Символьные данные

3.8.1. Объявление символьных данных

Символьный тип данных в Фортране могут иметь переменные и константы, которые мы будем называть строками, а также массивы и функции. Элементом символьного массива является строка. Возвращаемый символьной функцией результат также является строкой.

Символьные объекты данных объявляются оператором CHARACTER: CHARACTER [(type-param)] [[attrs] ::] vname

type-param - длина vname и значение параметра разновидности; может иметь одну из следующих форм:

([LEN = ] type-param-value);

(KIND = expr);

(KIND = expr, LEN = type-param-value);

([LEN =] type-param-value, KIND = expr).

type-param-value - может быть либо звездочкой (*), либо целой константой без знака в диапазоне значений от 1 до 32767, либо целочисленным константным выражением, вычисляемым со значением в диапазоне от 1 до 32767. Также если оператор CHARACTER объявляет формальные параметры и размещен в теле оператора INTERFACE или в разделе объявлений процедуры, то для задания type-param-value можно использовать и неконстантное описательное выражение (см. разд. 5.6). При этом если соответствующий фактический параметр задан, то формальный

65

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

параметр не может иметь атрибут SAVE, появляться в операторе DATA или быть инициализирован в операторе CHARACTER. Например, формальный параметр st3 подпрограммы sub:

character(len = 15) :: st = 'example', st2*20 /'example_2'/

...

call sub(st, 15) call sub(st2, 20)

...

end

subroutine sub(st3, n)

 

integer(4) n

! длина st3 при первом вызове

character(len = n) st3

print *, len(st3)

! равна 15, а при втором - 20

...

 

end

 

Если значение выражения, определяющего длину символьного элемента, отрицательное, то объявляемые символьные элементы будут нулевой длины. Если значение type-param не задано, то по умолчанию длина символьного объекта данных принимается равной единице.

expr - целочисленное константное или описательное выражение, задающие разновидность символьного типа. Фортран поддерживает одно значение параметра разновидности (KIND = 1) для символьных объектов данных.

attrs - один или более атрибутов, разделенных запятыми. Если хотя бы один атрибут задан, наличие разделителя :: обязательно. Используются те же, что и с оператором INTEGER (разд. 3.2.1) атрибуты. Если задан атрибут PARAMETER, то необходимо и инициализирующее выражение, например:

character(len = 20), parameter :: st = 'Title'

vname - имя переменной, константы или функции (внешней, внутренней, операторной, встроенной).

По умолчанию строка, которой не задано начальное значение, состоит из null-символов. Поэтому функция LEN_TRIM вернет для этой строки ее полную длину. Полезно выполнять инициализацию строки, например, пробелами:

character(30) fn, path /' '/

! path получает начальное значение

write(*, *) len(fn), len(path)

!

30

30

write(*, *) len_trim(fn), len_trim(path)

!

30

0

write(*, *) ichar(fn(1:1)), ichar(path(5:5))

!

0

32

Если

начальное значение строки

 

содержит меньше символов, чем

ее длина,

то недостающие символы

восполняются пробелами, которые

66

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

называются завершающими. Если начальное значение содержит больше символов, чем длина строки, то избыточные символы отсекаются.

Можно использовать символьные буквальные СИ-константы, завершаемые null-символами, например:

character(20) :: st = 'C string'c write(*, *) st

Как и для других типов данных, можно использовать синтаксис оператора CHARACTER Фортрана 77, например:

character*15 st1 /'first'/, st2 /'second'/

! Строки длиной в 15 символов

character*5 st3, st4*10, st5*15

! Строки длиной в 5, 10 и 15 символов

character*6 ast(10) /'Nick', 'Rose', 'Mike', 'Violet', 6*'???'/ character err*(*)

parameter (err = 'Error!')

Замечание. В FPS при инициализации с использованием коэффициента повторения необходимо следить за длиной инициализирующей буквальной символьной константы: ее длина должна совпадать с заданной в операторе CHARACTER длиной строки. Так, в операторе

character*6 ast(10) /'Nick', 'Rose', 'Mike', 'Violet', 6*'???'/

не будет выполнена инициализация последних пяти элементов массива. Для правильной инициализации следует использовать повторяющуюся

константу 6*'???

', в которой символ означает пробел. В CVF таких

проблем нет.

 

 

 

3.8.2. Применение звездочки для задания длины строки

Применение звездочки (*) для задания длины символьного объекта данных возможно в трех случаях:

1)при объявлении символьных именованных констант (объектов, имеющих атрибут PARAMETER). В этом случае длина строки равна числу символов константы, например:

character(*) st

!или character(len = *) st

!или character(len = *, kind = 1) st

!или character(*, kind = 1) st

!или character(kind = 1, len = *) st

parameter (st = 'exam')

или

character(len = *), parameter :: st = 'exam'! и так далее

Так же может быть объявлена символьная константа - массив: character(len = *), parameter :: ast(3) = (/'jan', 'febr', 'march'/)

или

67

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

character(len = *), parameter :: ast(3) /'jan', 'febr', 'march'/

print *, len(ast) ! 5 - длина каждого элемента массива

Длина элемента символьного массива вычисляется по максимальной длине инициализирующих массив символьных буквальных констант.

В нашем примере такой константой является 'march';

2)звездочка (*) может быть применена для задания длины символьного элемента при объявлении формальных символьных параметров. В этом случае длина формального параметра равна длине фактического параметра. Например:

character(len = 15) :: st = 'example', st2*20 /'example_2'/

...

call sub(st) call sub(st2)

...

end

subroutine sub(st3)

character(len = *) st3

! Длина st3 равна длине фактического параметра

print *, len(st3)

 

...

 

end

 

3)при объявлении длины возвращаемого внешней нерекурсивной символьной функцией результата также может быть использована звездочка. В таком случае действительная длина результата определяется в операторе CHARACTER той программной единицы, в которой осуществляется вызов функции. Например:

integer, parameter :: n = 20

 

character(len = 4) :: ins = '+ - '

! Длина возвращаемого функцией stfun

character(len = n) st, stfun

st = stfun(ins)

! результата равна n

print *, st

! # + - + - + - + - #

end

 

function stfun(pm)

! Длина строки pm равна длине строки ins

character(len = *) pm

!Длина возвращаемого символьной функцией результата определяется

!в той программной единице, где эта функция вызывается character(len = *) stfun

character(len = len(stfun)) temp temp = pm // pm //pm // pm stfun = '# ' // trim(temp) // ' #' end

!Строка temp - пример

!автоматического объекта данных

!для таких объектов не могут быть

!заданы атрибуты SAVE и STATIC

Символьные операторные или модульные функции, функции-массивы, функции-ссылки и рекурсивные функции не могут иметь спецификацию длины в виде звездочки (*).

68