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

Приложение 2. Нерекомендуемые, устаревшие и исключенные свойства Фортрана

Стандарт Фортран 90 сохранил все свойства Фортрана 66 и Фортрана 77. Теперь с введением новых средств для достижения одного и того же результата язык нередко предоставляет пользователю несколько возможностей. Причем часть из них стандарт относит к избыточным или устаревшим. Помимо этого, прежние стандарты содержат свойства, применение которых ухудшает структуру программы: операторы EQUIVALENCE, ENTRY (разд. 8.20) и вычисляемый GOTO. Эти операторы включены в стандарт Фортран 90, но относятся к нерекомендуемым.

Устаревшие свойства Фортрана не могут быть рекомендованы к применению также и потому, что следующий стандарт может их просто не содержать.

П.-2.1. Нерекомендуемые свойства Фортрана

П.-2.1.1. Фиксированная форма записи исходного кода

По умолчанию длина строки исходного текста при записи его в фиксированной форме равна 72 символам. Однако в результате применения директивы $FIXEDFORMLINESIZE она может быть увеличена до 80 или 132 символов.

Интерпретация символов строки Фортран-программы в фиксированной форме зависит от того, в какой колонке они указаны. Правила интерпретации сведены в табл. П.-2.1.

Таблица П.-2.1. Интерпретация символов строки программы

Колонки

Интерпретация символов

 

 

1

Символы $ или !MS$ (указывает на директиву)

 

 

1

Символы *, или с, или С, или ! (указывает на комментарий)

1-5

Метка оператора

 

 

6

Символ продолжения (кроме нуля и пробела)

 

 

7-72

Оператор Фортрана

 

 

73 и выше

Игнорируются

В фиксированной форме различают 5 типов строк: комментарии,

начальные строки, строки продолжения, директивы и отладочные строки.

Комментарий располагается либо после символа * и латинских букв c или C, размещенных в первую позицию строки, либо после восклицательного

417

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

знака, размещаемого в любой

(с 1-й

по

72-ю) позиции строки.

Строка

с восклицательным знаком в

колонке

6

интерпретируется как

строка

продолжения. Комментарии не оказывают никакого влияния на работу программы.

Первая, или единственная, строка оператора Фортрана называется начальной строкой. Начальная строка имеет либо пробел, либо 0 в 6-й колонке; в колонках 1-5 указываются метка оператора либо пробелы.

Метка оператора - целая константа без знака в диапазоне от 1 до 99999. Метки используются для ссылки на оператор. Ссылка на оператор выполняется в операторах перехода (GOTO), в операторах В/В для ссылки на оператор FORMAT, в операторах цикла и в других случаях.

Пример:

real x / -1.32 /, y / 6.487 /

 

write(*, 1) x, y

! Ссылка на оператор format

1format(2x, 'x = ', f6.2, 2x, 'y = ', f6.3)

...

if(exp(x/3.) .gt. cmax) go to 89

! Ссылка на оператор return

...

 

89 return

 

...

 

Строка продолжения содержит пробелы в колонках 1-5 и символ (отличный от нуля или пробела) в колонке 6. Строка продолжения увеличивает число доступных для записи оператора позиций. Число строк продолжения ограничено доступной памятью ЭВМ.

Директивы управляют работой компилятора. Директива начинается с символа $, или префикса !MS$ в FPS, или префикса !DEC$ в CVF. В любом случае в фиксированной форме директива должна начинаться в первой колонке строки, например:

$NOFREEFORM !DEC$NOFREEFORM !MS$NOFREEFORM

Отладочные строки. Включение режима проверки осуществляется директивой $DEBUG. Выключение - директивой $NODEBUG.

В одной строке исходного текста могут располагаться строки двух типов:

начальная строка и комментарий (после символа !);

строка продолжения и комментарий (после символа !).

Пример двух вариантов одной и той же программы, содержащей

начальные строки, комментарии и в варианте 2 строку продолжения.

C Вариант 1

C234567 - нумерация позиций

PROGRAM p1

! Комментарий

implicit none

! Должны быть объявлены типы всех объектов данных

418

Приложение 2. Нерекомендуемые, устаревшие и исключенные свойства

 

real d /4./, s /2.3/

! Объявляем переменные

 

write(*, *) s / sqrt(d)

! SQRT(x) - встроенная функция

 

end

! вычисления квадратного корня из x

* Вариант 2

 

*234567 - Комментарий

 

c Это тоже комментарий

 

 

data d /4./, s /2.3/

! Инициализация переменных

 

write(*, *)

! Начальная строка

*

s/sqrt(d)

! Строка продолжения

 

end

 

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

П.-2.1.2. Оператор EQUIVALENCE

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

EQUIVALENCE(nlist) [,(nlist)] ...

nlist - список двух или более переменных (простых или составных), разделенных запятыми. Список не может включать формальные параметры, динамические массивы и ссылки. Размерности массивов списка должны быть целыми константами. Заданное без размерностей имя массива адресует первый элемент массива.

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

character a*4, b*4, c*3(2) equivalence(a, c(1)), (b, c(2))

Графически перекрытие отображено на рис. П.-2.1.

1

2

3

4

5

6

7

------------

 

-------------a

 

 

 

 

 

 

 

-------------

 

-------------b

 

-------

c(1)

-------

------- c(2)

-------

 

Рис. П.-2.1. Перекрытие ассоциированных символьных элементов

Правила ассоциирования элементов:

переменная не может занимать более одной области памяти. Так, следующие операторы вызовут ошибку, поскольку пытаются адресовать переменную r двум различным областям памяти, в одной из которых размещен элемент s(1), а в другой - s(2):

419

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

real r, s(10)

 

equivalence(r, s(1))

 

equivalence(r, s(2))

! Ошибка

соответствующие элементы массивов должны ассоциироваться последовательно. Так, следующие операторы вызовут ошибку:

real r(10), s(10) equivalence(r(1), s(1))

equivalence(r(5), s(7)) ! Допустимо: equivalence(r(5), s(5))

Компилятор всегда выравнивает несимвольные элементы по четному байту. Символьные и несимвольные элементы могут быть ассоциированы, если несимвольный элемент начинается на четном байте. При необходимости компилятор разместит символьный элемент так, чтобы несимвольный начинался на четном байте. Однако это не всегда возможно. В следующем примере невозможно разместить символьный массив так, чтобы оба несимвольных элемента начинались на четном байте памяти.

character*1 char1(10) real a, b

equivalence(a, char1(1)) equivalence(b, char1(2))

Элемент списка nlist нельзя инициализировать в операторах объявления типа. Пример ошибки:

integer i /1/, j

! Ошибка

equivalence(i, j)

 

Оператор EQUIVALENCE не может разделять память между двумя common-областями или между элементами одного и того же общего блока.

Оператор EQUIVALENCE может расширить common-область в результате добавления переменных, продолжающих common-область. Нельзя расширять common-область, добавляя элементы перед этой областью. Так, следующие операторы вызовут ошибку:

common /b1/ r(10)

 

real s(20)

 

equivalence(r(1), s(7))

! Правильно: equivalence(r(1), s(1))

Ошибка возникает из-за того, что перед общей областью должны быть размещены элементы s(1), ..., s(6).

Если использована директива $STRICT или опция компилятора /4Ys, то при работе с оператором EQUIVALENCE следует придерживаться следующих правил:

если ассоциируемый объект имеет стандартный целый, логический, вещественный, вещественный двойной точности тип или относится к упорядоченному производному типу с числовыми и логическими компонентами, то все объекты в операторе EQUIVALENCE должны иметь один из таких типов;

420