【发布时间】:2019-11-01 15:44:19
【问题描述】:
我正在尝试在 Fortran 主程序和子程序之间传递参数。然而,由于某种原因,在子程序中获得了不同的值。我正在使用常见的块。
program main
nzcur=1
write(*.*)"nzcur in main",nzcur
call hit
subroutine hit
common/part/nzcur
write(*,*)"nzcur in hit",nzcur; pause
end
end program
我期待nzcur=1,但我得到nzcur=0。
我认为这可能是数据类型不匹配,因为我没有定义它,只是作为一个公共块。
【问题讨论】:
-
我正在使用普通块 Noooohhhhhhh !只是不要。查找在过去 40 年的某个时候编写的基本 Fortran 教程,并学习如何在子例程之间传递参数。您也应该在本网站的其他问题和答案中找到有用的材料。
-
为了我们孩子的利益,请对
COMMON块说“Nooooohhhh”。正如你所发现的,它充满了危险。如果您不想对子例程使用参数(出于某种未知原因),请使用MODULE。 -
在过去的 40 年中,也应该使用暂停。并且请显示您实际尝试的程序,或者如果它有点长,请显示一个缩减版本 - 以上不会在任何版本的 Fortran 下编译。
-
subroutine之前应该有一个 contains,或者子程序必须在end program之后,否则程序根本无法编译。如果您对任何代码有疑问并在此站点上提问,请始终显示minimal reproducible example。它应该是一个可以尝试编译的实际代码。 -
感谢您的回复,我已经删除了我的常用块,现在正在尝试使用模块。我使用的是通用块,因为这是我使用的书所建议的。我现在收到以下错误:` 错误 #7002:打开编译的模块文件时出错。检查包含路径。 [变量] ` 代码是:
module variables real(8) nzcur save end module variables program main use variables nzcur=1 call hit end program main contains subroutine hit use variables write(*,*)nzcur end
标签: fortran fortran-common-block