#fortran
#fortran
Вопрос:
Я пытаюсь понять некоторый код Fortran, который был передан мне. Это список аргументов в подпрограмме:
INTEGER, INTENT(IN) :: NKT
REAL, INTENT(IN) :: NW2(NKT), VAR, SUE
REAL, INTENT(INOUT) :: MYSPC(NKT,NKT)
Я понимаю объявления NKT, VAR и SUE . Но что означают «(NKT)» и «(NKT, NKT)» в NW2 (NKT), MYSPC (NKT, NKT)? Указывает ли NKT размеры массивов NW2 и MYSPC? Или это говорит о том, что подпрограмма сохраняет переданное значение в NKTth позиции NW2?
Я действительно смущен использованием () после переменной. Это не описано в книге Найхоффа «Введение в FORTRAN 90». Любая помощь будет оценена.
(Код представляет собой модифицированный сегмент Wavewatch, http://polar.ncep.noaa.gov/waves/wavewatch /)
Комментарии:
1. Вероятно, вы недостаточно внимательно читаете книгу.
2. Я нажал на этот вопрос, просто чтобы посмотреть
fortran
, как выглядит вопрос … : D3. Причина, по которой вы споткнулись здесь, вероятно, заключается в том, что «старым» является не только стиль объявления массива, но и способ передачи массивов процедурам. В вашем примере
NW2
иMYSPC
являются автоматическими массивами, которые автоматически получают свой размер изNKT
аргумента. Начиная с Fortran 90 или более поздней версии, вы часто увидите, что это делается с использованием массивов предполагаемой формы , таких какNW2(:)
иMYSPC(:,:)
, которые принимают форму фактического переданного аргумента, не требуя от вас явной передачи их размера, как это сделано здесь .
Ответ №1:
В вашем примере NW2(NKT) представляет собой массив с элементами NKT, MYSPC(NKT,NKT) представляет собой 2D-массив NKTxNKT. Если в вашей книге по Фортрану это действительно не рассматривается, найдите книгу получше. Если у вас есть некоторый предыдущий опыт программирования, я рекомендую «Modern Fortran Explained» Меткалфа, Рейда и Коэна.
Ответ №2:
Это старый стиль объявления массива. Ваша книга, вероятно, подчеркивает новый стиль dimension ()
before the ::
. Некоторые могут счесть преимуществом этого стиля то, что массивы и скаляры могут быть смешаны в одном объявлении, как это сделано во второй строке вашего примера. Я предпочитаю новый стиль.
Комментарии:
1. Это может выглядеть лучше, но это слишком многословно.
2. Вы правы — измерение покрыто, но более старый стиль, похоже, отсутствует (в моей книге). Спасибо за установление связи между двумя стилями!
Ответ №3:
Чтобы, возможно, помочь вам согласовать это с вашей книгой, учтите, что
REAL, INTENT(IN) :: NW2(NKT)
REAL, INTENT(INOUT) :: MYSPC(NKT,NKT)
эквивалентно
REAL, INTENT(IN), DIMENSION(NKT) :: NW2
REAL, INTENT(INOUT), DIMENSION(NKT,NKT) :: MYSPC
Это два способа сказать одно и то же при объявлении массивов.