调用和子例程之间的整数值的变化

时间:2014-01-31 23:07:09

标签: variables fortran

我正在尝试在几十年前以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

但是,所有整数(iyearimonthidayndayseed)的值都会在我的子程序中更改。< / 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写的不够了解。

2 个答案:

答案 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

请注意,没有明确声明变量seedtdomthick,因此您的implicit none会让我对您编译代码的原因感到困惑。 [甚至虚拟参数需要用implicit none明确声明,除非您使用其他形式的关联来获取这些变量?]

最后,我回应@ M.S.B。关于不以固定格式编写新代码的评论,因为我认为你没有使用仅限F77的编译器。