我正在尝试在几十年前以Fortran为基础的计划中实施一个新的子程序inigw
,并且正在努力奋斗。我是Fortran的初学者,所以希望我找不到明显的东西。
我正在调用子程序inigw(iyear,imonth,iday,nday,time,seed)
。在调用的6个输入变量中,除time
外都是整数。如果我在调用之前立即写出变量,一切看起来都很好:
if (gwexist.eq.2 .and. iyear.ge.igwyear .and. iyear.le.igwend) then
write(*,*) 'iyear in call = ', iyear
write(*,*) 'imonth in call = ', imonth
write(*,*) 'iday in call = ', iday
write(*,*) 'nday in call = ', nday
write(*,*) 'time in call = ', time
write(*,*) 'seed in call = ', seed
call inigw (iyear,imonth,iday,nday,time,seed)
endif
输出看起来像我期望的那样:
iyear in call = 2013
imonth in call = 1
iday in call = 4
nday in call = 4
time in call = 28800.00
seed in call = 1776642162
但是,所有整数(iyear
,imonth
,iday
,nday
和seed
)的值都会在我的子程序中更改。< / p>
c ---------------------------------------------------------------------
subroutine inigw (iyear, imonth, iday, nday, time, seed)
c ---------------------------------------------------------------------
c SCZ- 1/31/2014
c This routine is intended to read in hourly depth to groundwater data from
c text files. Much of the language is borrowed from inimet.
c Define some variables
implicit none
real
> dtgwin(ndpts), ! read-in depth to groundwater
> time, ! time in seconds since start of day
> tdomthick ! total domain thickness [m]
integer
> seed,
> nday,
> iyear, ! main routine year
> imonth, ! main routine month
> iday, ! main routine day
c
write(*,*) 'iyear in inigw = ', iyear
write(*,*) 'imonth in inigw = ', imonth
write(*,*) 'iday in inigw = ', iday
write(*,*) 'nday in inigw = ', nday
write(*,*) 'time in inigw = ', time
write(*,*) 'seed in inigw = ', seed
...
现在整数的值不同,但实数(time
)是一样的!
iyear in inigw = 2.8208138E-42
imonth in inigw = 1.4012985E-45
iday in inigw = 5.6051939E-45
nday in inigw = 5.6051939E-45
time in inigw = 28800.00
seed in inigw = 3.4667155E+25
有趣的是,还有另一个子程序inimet
,其结构与调用的相同输入基本相同,并且变量成功通过该调用。我想我在这里遗漏了一些明显的东西,但我不确定究竟是什么。我试过谷歌搜索,什么也没发现。对不起,我不能提供一个可重复的例子 - 我对Fortran写的不够了解。
答案 0 :(得分:1)
奇怪的是,time
是唯一似乎保持不变的人。它是 唯一一个未在函数中声明的integer
语句,它似乎从左边开始一列太远。
修复该缩进并解决您的问题。 FORTRAN是那种对这类事情非常挑剔的语言之一。
答案 1 :(得分:1)
正如我们已经确定问题是缩进的(请参阅@paxdiablo的回答)我认为详细说明为什么不会受到伤害。
代码使用的是固定格式的源代码。这意味着除了空格或&#34; 0&#34;之外的字符。第6列中的字符被视为 continuation 字符。你的&#34;我&#34; &#34;整数&#34;是这样一个角色。这与空白的一般意义不大,意味着你的代码片段
real
> dtgwin(ndpts), ! read-in depth to groundwater
> time, ! time in seconds since start of day
> tdomthick ! total domain thickness [m]
integer
> seed,
> nday,
相当于
real
> dtgwin(ndpts), ! read-in depth to groundwater
> time, ! time in seconds since start of day
> tdomthickntegerseed,
> nday,
(同时注意到评论不影响节目解释)。
所以nday
和以下变量确实被声明为real
。
请注意,没有明确声明变量seed
或tdomthick
,因此您的implicit none
会让我对您编译代码的原因感到困惑。 [甚至虚拟参数需要用implicit none
明确声明,除非您使用其他形式的关联来获取这些变量?]
最后,我回应@ M.S.B。关于不以固定格式编写新代码的评论,因为我认为你没有使用仅限F77的编译器。