2013-04-04 125 views
1

我已经问过这个问题了,但是这次我试图更清楚一点。 我真的是Fortran的新手,所以原谅任何sytax错误,这是更多伪代码。fortran模块的范围

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 

如果我包括我的模块将它们保留其值some_other_function() 假设some_other_function()是一个巨大的仿真程序的一个抽象。 我可以依靠我的初始化变量保持它们的值。

这是模块中的SAVE语句吗?

背景信息:我有程序1正在被program2 调用很长时间。 Program1有一个巨大的利用阶段,只需要发生一次。如果我在program2调用program1之前运行了初始阶段,是否可以依赖所有保存的模块声明变量

+0

另外我还有做一个endubroutine保存, 或包括保存在模块 – 2013-04-04 19:31:44

回答

3

在模块中使用SAVE语句时,模块变量的值在运行期间保留程序。如果您在一个程序中初始化它们,主程序和其他程序将会看到这些值。只要他们是在范围模块变量被保留下来,因为你可以从主程序use你的榜样模块,它们的值将保留为运行即使没有SAVE发言时间。原则上,如果某个模块仅用于某些过程,并且未使用语句,则编译器可能在调用链中没有任何过程时“忘记”这些值。可能很多或许所有的编译器不实际重置价值......这将是额外的工作,找出一个模块是否超出范围。

P.S.你的例子有一个错误,因为你永远不会初始化x和y。你只能改变它们的值。

+2

+1有区别+1:作为次要记录,F2008指定模块变量隐含SAVE'd。 – janneb 2013-04-04 18:27:51

+0

现在另一个问题是,即时通讯软件处理。有一个仿真程序1调用另一个仿真程序2。 Program2有可能在多个线程上运行。 Im相当肯定目前这个问题,因为程序2利用被写入主要包括保存模块,所以变量可以同时仍然需要它们被覆盖。 有没有一个简单的解决方法。我可以创建一个派生类型,它只是包含所有这些模块。 – 2013-04-04 19:23:46

+1

@RobertLemiesz:是的,这听起来像是一个问题。不,没有简单的解决方法。改造线程安全到没有考虑到这一点而设计的程序往往是大量的工作.. – janneb 2013-04-04 19:42:31