Список параметров: значение круглой скобки после имени

#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 , как выглядит вопрос … : D

3. Причина, по которой вы споткнулись здесь, вероятно, заключается в том, что «старым» является не только стиль объявления массива, но и способ передачи массивов процедурам. В вашем примере 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
  

Это два способа сказать одно и то же при объявлении массивов.