Может ли массив форм Fortran 90 быть ДОПОЛНИТЕЛЬНЫМ аргументом?

ПРИМЕЧАНИЕ. Я все еще изучаю эту проблему - пожалуйста, пока не пытайтесь ее решить - ошибка может быть где-то еще

Я хотел бы, чтобы аргумент подпрограммы был НЕОБЯЗАТЕЛЬНЫМ, но этот аргумент также является массивом предполагаемой формы. Когда я пытаюсь скомпилировать модуль, содержащий эту подпрограмму, я получаю следующую ошибку:

PGF90-S-0189-Аргумент номер 3 для (подпрограмма): ассоциация скалярного фактического аргумента с фиктивным аргументом массива (местоположение)

Процедура выглядит так:

SUBROUTINE EXAMPLE(A, B, C)
   IMPLICIT NONE
   INTEGER, INTENT(IN) :: A, B
   INTEGER, OPTIONAL, DIMENSION(:), INTENT(IN)   :: C
   INTEGER :: TEST

   IF (PRESENT(C)) THEN
      TEST=C(1)
      PRINT *,TEST
   ELSE
      PRINT *,A,B
   ENDIF

END SUBROUTINE EXAMPLE

Он содержится в модуле. Я получаю сообщение об ошибке, когда пытаюсь вызвать его только с двумя аргументами из подпрограммы, которая ИСПОЛЬЗУЕТ модуль.

Я нашел только один, возможно, связанный вопрос на форумах Portland Group здесь:

http://www.pgroup.com/userforum/viewtopic.php?t=624&sid=d76fdf8ca2bf4fc3109f4f49b1de0ad7

Ответ сводится к тому, что пользователь использует необязательный аргумент, который не был выделен - я не знаю, применимо ли это в моем случае, поскольку я не использую 'C' вне блока IF (PRESENT (C)), но может ли происходить неявное выделение при определении переменной как предполагаемой формы, которое не может быть выполнено, если оно изначально не передается?


person Chris Whittleston    schedule 28.03.2014    source источник
comment
Это не точный код, я просто взял суть того, что он делает, как упрощенную иллюстрацию. Я переименовал подпрограмму в EXAMPLE, чтобы предотвратить конфликт имен.   -  person Chris Whittleston    schedule 28.03.2014
comment
Нет прямого запрета на использование optional с манекеном заданной формы. Это не означает, что все варианты использования являются правильными, поэтому не могли бы вы предоставить MCVE для вашего проблемного случая?   -  person francescalus    schedule 28.03.2014
comment
Сообщение об ошибке, о котором вы сообщаете, не имеет ничего общего с необязательной или предполагаемой формой - оно жалуется на то, что вы передали скаляр в аргумент массива, что не разрешено стандартом (с некоторыми исключениями). Я обсуждаю это в программное обеспечение. intel.com/en-us/blogs/2009/03/31/. Поскольку вы не показали нам звонок, трудно говорить более конкретно.   -  person Steve Lionel    schedule 28.03.2014
comment
Спасибо за ответы, я добавлю дополнительную информацию, включая звонок, когда я не в пути.   -  person Chris Whittleston    schedule 28.03.2014
comment
Я только что написал упрощенную версию того, что находится в реальном коде, и теперь, похоже, он работает, поэтому я подозреваю, что проблема не в том, что я думал изначально. Я собираюсь провести еще несколько исследований и обновить это, когда у меня появится.   -  person Chris Whittleston    schedule 29.03.2014


Ответы (1)


Теперь эта проблема решена - вы действительно можете использовать предполагаемые массивы фигур в качестве необязательных аргументов. Как указано в комментариях, ошибка возникла из-за старой версии исходного файла, который не регенерировался на этапе предварительной обработки из-за ошибки. В результате вызов оказался не таким, как я думал - на самом деле он содержал одно целое число в качестве третьего аргумента.

Всем спасибо за помощь.

person Chris Whittleston    schedule 01.04.2014