gpt4 book ai didi

save - FORTRAN 子程序什么时候保存数据,什么时候不保存?

转载 作者:行者123 更新时间:2023-12-04 04:45:52 25 4
gpt4 key购买 nike

有一个非常简单的函数来获取月份的名称,“Jan”,“Feb”等并转换为月份的数字:

function month_num(month_str)

character*(*) :: month_str
character*3 :: month_names(12)
integer :: ipos(1),location(12)

data month_names/'Jan','Feb','Mar','Apr','May','Jun','Jul','Aug', &
'Sep','Oct','Nov','Dec'/

where (month_names==month_str) location=1

ipos = maxloc(location)
month_num = ipos(1)

end function

好的,是的,我知道在使用它之前不定义“位置”是很危险的。

问题:在函数执行期间,如果输入正确,“位置”的某个值将被设置为 1。令我惊讶的是,当再次调用该函数时,该值仍然等于 1。而这个,当然,真的把事情搞砸了。所以我想我会用一条新线来修复它
data location/12*0/

我遇到了同样的问题。

最后,我输入
location = 0

就在“where”语句之前,这解决了所有问题。

所以,我认为 FORTRAN 子程序不会保存数据,除非变量是用“SAVE”属性声明的。此外,对于许多编译器,您可以调用某种“静态”选项来保存所有内容。我在这里都没有做这些,但是“位置”数组被保存了。有人可以告诉我 FORTRAN 何时保存数据以及何时不保存数据的规则吗?谢谢。

最佳答案

过程局部变量的值通过以下两种方式之一保存(即SAVE d):

  • 程序员指定SAVE声明变量时的属性,例如:
    REAL, SAVE :: var1
  • 程序员在声明时初始化变量,例如
    REAL :: var1 = 3.1415

  • 这第二种隐含的行为是 Fortran 的一个特性,它似乎旨在吸引程序员,而不仅仅是初学者。请注意,在第二个示例中,变量在重新调用时的值不是 3.1415,但无论最后一次调用退出时它有什么值(value)。

    编译器通常表现得好像一个变量是 SAVE d 当程序员没有使用这些选项中的任何一个时,可能一次调用过程使用的内存位置在下一次调用之前不会被覆盖。但这种行为是不可靠的。

    对于在模块中声明的变量,情况略有不同。再次使用 SAVE 的任何变量属性被保存,但任何其他变量仅在模块与已开始执行但未完成的程序单元使用关联时保留其值。同样,尽管模块超出范围,但某些编译器和某些程序的某些执行可能会表现得好像模块变量的值被保留,但这是非标准行为,不应依赖。

    当模块中定义的变量将获得 SAVE 时,此行为计划在 Fortran 2008 中更改。隐含的属性。

    我个人喜欢明确 SAVE即使我确定它们会隐式获取属性,变量也会使代码在下一次更容易理解。

    关于save - FORTRAN 子程序什么时候保存数据,什么时候不保存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18192552/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com