У меня есть несколько вопросов о INTENT
переменных в подпрограмме на Фортране. Например, несколько недель назад я опубликовал вопрос о другой теме на Фортране ( В Фортране 90, что является хорошим способом записи массива в текстовый файл по строкам? ), и один из ответы включали код для определения команд tick
и tock
. Я нашел их полезными для запуска моего кода. Я вставил tick
и tock
ниже и использовал их в простом примере, чтобы рассчитать цикл DO
:
MODULE myintenttestsubs
IMPLICIT NONE
CONTAINS
SUBROUTINE tick(t)
INTEGER, INTENT(OUT) :: t
CALL system_clock(t)
END SUBROUTINE tick
! returns time in seconds from now to time described by t
REAL FUNCTION tock(t)
INTEGER, INTENT(IN) :: t
INTEGER :: now, clock_rate
CALL system_clock(now,clock_rate)
tock = real(now - t)/real(clock_rate)
END FUNCTION tock
END MODULE myintenttestsubs
PROGRAM myintenttest
USE myintenttestsubs
IMPLICIT NONE
INTEGER :: myclock, i, j
REAL :: mytime
CALL tick(myclock)
! Print alphabet 100 times
DO i=1,100
DO j=97,122
WRITE(*,"(A)",ADVANCE="NO") ACHAR(j)
END DO
END DO
mytime=tock(myclock)
PRINT *, "Finished in ", mytime, " sec"
END PROGRAM myintenttest
Это приводит к моему первому вопросу о INTENT
(мой второй вопрос, ниже, касается подпрограмм или аргументов / переменных функций, для которых INTENT не явно указан):
Чтобы запустить таймер, я пишу CALL tick(myclock)
, где myclock
- целое число. Заголовок подпрограммы - SUBROUTINE tick(t)
, поэтому он принимает фиктивное целое число t
в качестве аргумента. Однако внутри подпрограммы t
задано INTENT (OUT): INTEGER, INTENT(OUT) :: t
. Как это может быть? Мое наивное предположение состоит в том, что INTENT (OUT) означает, что значение этой переменной может быть изменено и будет экспортировано из подпрограммы - и не считывается. Но ясно, что t
читается в подпрограмма; Я передаю целое число myclock
в подпрограмму. Так как t
объявлено как INTENT (OUT), как может случиться так, что t
, кажется, также прибывает в ?
Я заметил, что в функции tock(t)
целочисленные переменные now
и clock_rate
не имеют явно заданных значений INTENT. Тогда каков охват этих переменных? now
и clock_rate
только видны внутри функции? (Вроде как INTENT (NONE) или INTENT (LOCAL), хотя такого синтаксиса нет?) И, хотя это функция, верно ли то же самое для подпрограмм? Иногда, когда я пишу подпрограммы, я хотел бы объявить «временные» переменные, подобные этой, - переменные, которые видны только внутри подпрограммы (например, для изменения ввода на шаге, предшествующем назначению окончательного результата). Это то, что достигается отсутствием указанного INTENT?
Я просмотрел текст (текст Fortran 90 от Hahn ) и в нем он дает следующее краткое описание намерения аргумента:
Намерение аргумента. Пустые аргументы могут быть указаны с помощью
intent атрибут, то есть намерены ли вы использовать их в качестве входных данных,
или вывод, или оба, например
SUBROUTINE PLUNK(X, Y, Z)
REAL, INTENT(IN) :: X
REAL, INTENT(OUT) :: Y
REAL, INTENT(INOUT) :: Z
...
Если намерение IN, фиктивный аргумент может не иметь измененного значения
внутри подпрограммы.
Если целью является OUT, соответствующий фактический аргумент должен быть
переменная. Вызов, такой как
CALL PLUNK (A, (B), C)
приведет к ошибке компилятора - (B) - это выражение, а не переменная.
Если намерение INOUT, соответствующий фактический аргумент должен снова
быть переменной.
Если фиктивный аргумент имеет нет намерения, фактический аргумент может быть
переменная или выражение.
Рекомендуется указывать все фиктивные аргументы. В
В частности, все аргументы функции должны иметь намерение IN. Намерение может
также указывается в отдельном утверждении, например, НАМЕРЕНИЕ (ВХОД) X, Y, Z.
В приведенном выше тексте даже не упоминается аргумент / переменная scope ; похоже, в основном речь идет о том, можно ли изменить аргумент / переменную значение внутри подпрограммы или функции. Верно ли это, и если да, что я могу предположить о сфере действия в отношении INTENT?