比较整数的非常奇怪的FORTRAN错误

时间:2011-01-05 13:26:38

标签: compare fortran

我正在尝试检查某些行在几个时间步执行多少次,这是我的代码的一部分: 1)每次写“countd”:

real(kind=8) function dergfm(jp,ip,lp)
integer :: jp,ip,lp,countd
real(kind=8) press
    .
    .
    .
   countd=countd+1
   !if (countd < 5) then 
   print*, "countd= ", countd
   !endif
    .
    .
    .
end function dergfm

结果:

countd=            1
.
.
.
countd=            21504

2)先写“countd”4次:

    real(kind=8) function dergfm(jp,ip,lp)
integer :: jp,ip,lp,countd
real(kind=8) press
    .
    .
    .
   countd=countd+1
   if (countd < 5) then 
   print*, "countd= ", countd
   endif
    .
    .
    .
end function dergfm

结果:

countd=            1
countd=            2
countd=            3
countd=            4

3)写“countd”大于5

    real(kind=8) function dergfm(jp,ip,lp)
integer :: jp,ip,lp,countd
real(kind=8) press
    .
    .
    .
   countd=countd+1
   if (countd > 5) then 
   print*, "countd= ", countd
   endif
    .
    .
    .
end function dergfm

结果:

[none]

看起来比较这些整数适用于.lt。但不适合.gt。 (也不是.eq。)

2 个答案:

答案 0 :(得分:2)

countd是函数的局部变量。因此,它的值不一定保留在调用之间,除非您在声明中添加“save”属性。试试这个,看看代码是否开始表现。你如何初始化countd?我会使用以下内容:

整数,save :: countd = 0

在这种情况下,“save”是可选的,因为声明中的初始化暗示了它。

答案 1 :(得分:0)

如果变量未被保存,则行为未定义且可能发生奇怪的事情。 对于某些编译器,COUNTD的值将初始化为零和代码 将按预期工作。对于其他编译器,每次都会得到完整的垃圾 你打电话给这个子程序。

其他时候(我怀疑是你的情况),变量放在堆栈和MAY上 每次调用子例程时都会分配相同的内存。或者,它可能会得到 在前4或5次分配相同的内存,然后一些其他子程序破坏 第6次堆栈和COUNTD的值变成垃圾。

正确答案是保存变量并使用数据语句对其进行初始化。 这是便携式的,适用于每个系统。