我正在编写一个程序,它会多次调用子程序。这个子程序在一个项的总和上循环,每个项除以一个项的数的阶乘(很像泰勒级数)。它总是相同的项数,因此除法因子总是相同的。为了不在每次调用中计算阶乘,最好只定义一次向量,然后通过相应的坐标除以(实际上,乘法;我将向量定义为1/n!
)。例如:
S=(T0)+(T1/1)+(T2/2!)+(T3/3!)+...+(Tn/n!)
(对于不同的数组T1,...,Tn
)
哪种方法是最佳实践:将其定义为具有save属性的变量,还是将其放在模块中并将其包含在子例程中?还是有更好的选择? (为什么?)
从另一个问题(fortran SAVE statement),我希望最好的办法是在子程序中使用SAVE(因为我可能不会在任何其他子程序中使用这个变量,我会无论如何都要使用SAVE),但我欢迎对此提出一些反馈。
编辑:抱歉,新添加。假设最好的办法是使用SAVE;将它定义为可分配变量是否可以?我知道可分配变量和常规变量从内存的不同部分绘制;我不知道它如何与SAVE属性交互...(我将依赖于退出时自动解除分配变量的程序)。答案 0 :(得分:2)
两种选择几乎相同。初始化或最终化变量时可能会出现差异。
您可以使用任何使用该模块的代码使用模块变量的值初始化或执行其他操作。子程序的局部变量实际上是它本地的。
我没有看到为什么通常会选择其中一个或另一个的任何理由,这取决于该计划的整体结构。变量的确切目的和用法是什么。
我稍微喜欢这个模块。对于大型可分配数组,您可以在需要时更轻松地释放内存,而无需使用特殊参数调用子例程。此外,您将拥有子程序的简单代码,而无需检查它是否是第一次调用。
可分配变量可以是save
,没有任何问题。但是没有理由认为本地save
变量通常是最好的。