首页 > 解决方案 > 在子例程中使用变量而不在 Fortran 中传递它们

问题描述

我开始使用大量使用以下“功能”的旧 Fortran 代码:

subroutine sample 
        integer*4 :: a, b
    
        a = 1
        b = 1

        call increment(b)

        print *, a, b ! Prints "2 2"

contains
        subroutine increment(c)
                implicit none
                integer*4, intent(inout) :: c

                c = c + 1
                a = a + 1

        end subroutine increment
end subroutine sample

在代码中的多个场合,子程序中的变量在(子)子程序中使用,而不通过参数传递。在有人指出之前,我认为这不是一个好的编码范例,但它是我应该处理的代码,我必须处理它。

我的问题是如果这实际上是合法的,我在 Fortran 语言参考中找不到。我从未使用过这个“功能”,我认为它不合法,但这段代码使用 GCC、intel Fortran、pgi、nvhpc 编译了 20 年,没有问题。最近我尝试用一​​个 API 编译它,但在多个情况下,(子)子例程中的变量包含垃圾数据(但并非总是如此)。

我的问题是这是否真的是合法的事情?它只是其他编译器方言的一部分吗?或者它是oneapi的错误?

标签: fortran

解决方案


推荐阅读