Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scope fortran模块的范围_Scope_Fortran - Fatal编程技术网

Scope fortran模块的范围

Scope fortran模块的范围,scope,fortran,Scope,Fortran,我已经问过这个问题,不过这次我会尽量说得更清楚。 我对fortran真的很陌生,所以请原谅任何sytax错误,这是更多的伪代码 module variables implicit none SAVE integer x integer y end module subroutine init() use variables x = x + 2 y = y + 1 endsubroutine 那么我的主要节目是 program main

我已经问过这个问题,不过这次我会尽量说得更清楚。 我对fortran真的很陌生,所以请原谅任何sytax错误,这是更多的伪代码

module variables
   implicit none
   SAVE

   integer x
   integer y

 end module

subroutine init()

  use variables

  x = x + 2
  y = y + 1
endsubroutine
那么我的主要节目是

 program main
    use variables
    implicit none

    call init()

    call some_other_function()
  endprogram
如果我包括我的模块,它们会在一些函数()中保留它们的值吗 假设某个函数()是一个大型模拟程序的抽象。 我可以依靠我的初始化变量保持它们的值吗

这是模块中的SAVE语句吗

背景信息:我有一个被program2调用的program1
在相当长的一段时间内。Program1有一个巨大的初始化阶段,只需要发生一次。如果在program2调用program1之前运行了初始阶段,我是否可以依靠模块中的
SAVE
语句保存的所有模块声明变量,模块变量的值将在程序运行期间保留。如果在一个过程中初始化它们,主程序和其他过程将看到这些值。只要模块变量在范围内,它们就会被保留,因此,由于您使用主程序中的示例模块,即使没有
SAVE
语句,它们的值也会在运行期间保留。原则上,如果模块仅在某些过程中使用,而未使用
SAVE
语句,则当调用链中没有任何过程时,编译器可能会“忘记”这些值。可能许多或所有编译器实际上都没有重置值。。。要弄清楚一个模块是否超出了范围,这将是额外的工作


另外,您的示例有一个错误,因为您从未初始化x和y。您只需更改它们的值。

+1:作为一个次要说明,F2008指定模块变量隐式保存为'd'。现在另一个问题是我正在处理的软件。有一个模拟程序1调用另一个模拟程序2。Program2有可能在多个线程上运行。我很确定这是一个问题,因为program2主要使用保存模块的include编写,所以变量可以在仍然需要时被覆盖。有没有一个简单的解决办法。我可以创建一个派生类型吗?它只是所有这些模块的一个包含。@RobertLemiesz:是的,听起来像是个问题。不,没有简单的解决办法。将线程安全性改装到一个没有考虑到这一点的程序中往往是一项艰巨的工作。此外,我认为执行endsubroutine保存或将保存包含在模块中有区别