2013-10-25 3 views
1

I имеет следующую структуру коды:Fortran: внешний аргумент функции имеет размер 0

PROGRAM main 

    IMPLICIT NONE 

    REAL*8, DIMENSION(:), ALLOCATABLE :: var 

    ALLOCATE(var(3)) 

    var(1) = 1.0d0 
    var(2) = 2.0d0 
    var(3) = 3.0d0 

    CALL f1(var, f2) 

    CONTAINS 

    SUBROUTINE f1(arg_in, fun) 

    REAL*8, DIMENSION(:), INTENT(IN) :: arg_in 
    EXTERNAL fun 

    PRINT *, arg_in 

    CALL fun(arg_in) 

    PRINT *, arg_in 

    END SUBROUTINE f1 

    SUBROUTINE f2(arg_in) 

    REAL*8, DIMENSION(:), INTENT(INOUT) :: arg_in 

    PRINT *, SIZE(arg_in) 

    arg_in = 2.0d0 * arg_in 

    RETURN 

    END SUBROUTINE f2 

END PROGRAM main 

При выполнении программы, я заметил, что размер массива в функции f2 = 0. В моей реальной программе у меня есть Та же проблема, хотя я получаю сообщение об ошибке в отличие от моей простой программы выше:

Попытка использовать указатель F, если она не связана с целевым

Может ли кто-нибудь дать подсказку, что может быть проблемой?

+0

Вы не можете получить то же сообщение об ошибке, если вы не используете указатели, и ошибка конкретно упоминает об этом. –

ответ

4

Проходите подпрограмму как внешнее, но он имеет вымышленную форму фиктивный аргумент, поэтому она нуждается явный интерфейсом, вы должны указать его с помощью процедуры

procedure(f2) :: fun 

или интерфейсного блок

interface 
    SUBROUTINE fun(arg_in) 
    REAL*8, DIMENSION(:), INTENT(INOUT) :: arg_in 
    end 
end interface 

После этого вы также поймете, что f2 изменяет массив arg_in, и поэтому его ссылается на f1, который имеет массив arg_in как intent(in) ,

Смежные вопросы