ЗАБЕЛЕЖКА: Все още проучвам този проблем – моля, не го разглеждайте още – грешката може да е другаде
Бих искал аргументът към подпрограмата да е НЕЗАДЪЛЖИТЕЛЕН, но този аргумент също се оказва масив с предполагаема форма. Когато се опитвам да компилирам модула, съдържащ тази подпрограма, получавам следната грешка:
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)), но може ли да има имплицитно разпределение, когато се дефинира променлива като предполагаема форма, която не може да бъде извършена, когато не е предадена на първо място?
optional
с манекен с приета форма. Това не означава, че всички употреби са правилни, така че можете ли да предоставите MCVE за вашия проблемен случай? - person francescalus   schedule 28.03.2014