有一个非常简单的函数来获取月份的名称,“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 何时保存数据以及何时不保存数据的规则吗?谢谢。