2016-12-16 17 views
1

Возможно ли в Fortran определить подпрограмму внутри другой подпрограммы? Когда я пытаюсь что-то вродеОпределение подпрограммы в другой подпрограмме

SUBROUTINE test1(...) 
    ! do some stuff 
    CALL test2(...) 

    SUBROUTINE test2(...) 
    ! do some stuff 
    END SUBROUTINE test2 
END SUBROUTINE test1. 

Мой компилятор (Silverfrost) дает мне ошибку рекурсии.

+0

Если вы хотите, чтобы слово Fortran было частью названия в каком-то определенном месте, продолжайте, но просто «Fortran:' не следует использовать. Теги не должны просто копироваться в заголовок. –

+0

@agentp Если вы используете более крупную работу по перемотке, подумайте об использовании 'silverfrost-fortran', а не' silverfrost', похожего на [tag: intel-fortran] и [tag: nag-fortran]. –

+0

@ Владимир согласился. есть ли способ отредактировать тег или сделать новый и переключить их? – agentp

ответ

3

В комментариях HighPerformanceMark, можно определить внутреннюю процедуру в разделе другой процедуры

SUBROUTINE test1(...) 
    ! do some stuff 
    CALL test2(...) 

CONTAINS 

    SUBROUTINE test2(...) 
    ! do some stuff 
    END SUBROUTINE test2 
END SUBROUTINE test1 

Внутренняя процедура test2 получает доступ ко всем объектам, определенным в порядке, принимающей test1 по хоста содержит ассоциация. Он также получает доступ ко всем объектам, к которым имеет доступ test1. Правила аналогичны правилам внутренних процедур в основной программе.

Внутренняя процедура не может принимать другую внутреннюю процедуру.

Указатели процедуры для внутренних процедур действительны только во время выполнения хост-процедуры и разрешены только в Fortran 2008 и последующих версиях. Это расширенная функция.

Этот узел ассоциации иногда может раздражать, вы должны быть бдительными, чтобы избежать ошибок, как:

SUBROUTINE test1(...) 
    integer :: i 

    do i = 1, n 
    CALL test2(...) 
    end do 

CONTAINS 

    SUBROUTINE test2(...) 
    do i = 1, n 
     !i here is the same variable as i in test1!! 
    end do 
    END SUBROUTINE test2 
END SUBROUTINE test1 

Там будут функции в Fortran 2015, чтобы изменить поведение хозяина ассоциации.