fortran - 在子例程中使用变量而不在 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的错误?
解决方案
推荐阅读
- julia - 在 Google Colab 中使用 Julia 时如何导入本地数据集
- java - 为什么我的 ArrayList 在添加新对象后没有反映更新?
- c++ - 使用 gcc6.2.0 & gcc8.3.0 编译将获得局部变量的差异对齐
- ocaml - 什么是描述被方括号包围的多态变体的类型?
- javascript - 当对象从异步函数返回时,为什么使用等待的属性访问似乎会导致“未定义”?
- angular - Angular 在“ngFor”中使用单选组
- python - 通过在字典中附加熊猫数据框来创建字典
- javascript - Youtube API 密钥配额在使用有问题的密钥之前超过了
- python - Squish 测试:通过 Squish 获取活动窗口或顶部窗口
- python - python包安装不保存?