2011-01-05 62 views
0

我试图检查某些行有多少次在几分钟的时间步执行的,这里是我的代码部分: 1)写“COUNT天”每次:与比较整数很奇怪FORTRAN错误

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)写上 “COUNT天” 第一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)写 “COUNT天” 大于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。 (也就是说)

+1

您确定输入和所有全局变量对于每次运行都是相同的吗?如果是这样,看起来你已经碰到了一些非常奇怪和错误的东西。但是,为了演示,你必须令人信服地表明其他一切都没有改变。如果你忽略了用点表示的材料,毫无疑问它能正确执行。您需要保存当前的测试用例,然后将代码量减少到最小,仍然会重现问题。然后将错误报告提交给编译器供应商。 (裸露的最小值应该是50行或更少,只是为了给你一个目标。) – 2011-01-05 13:51:30

+0

@J。 Leffler:虽然编译器错误当然是可能的,但在99.9%的情况下,罪魁祸首是在用户代码中,例如,在这种情况下,某些数组边界错误会被计数。或者我们看不到的其他东西,因为它隐藏在“...”部分后面,OP不想分享。 – janneb 2011-01-05 14:59:46

+0

感谢所有的答案,我将检查您的建议,我没有发布代码,因为它是非常广泛的(100k +行)计算代码。最令我震惊的是<作品但不是>或== – madness 2011-01-10 09:24:03

回答

2

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

整数,节省:: COUNT天= 0

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

+0

事实证明,简单地写作“integer :: countd = 0”是可行的,但它仍然超出了我为什么IF语句中的“==”不起作用。 ..感谢所有的帮助,我不会试图消化它 – madness 2011-01-10 13:33:57

0

如果变量没有保存,行为是不确定的,奇怪的事情可能发生。 对于某些编译器,COUNTD的值将初始化为0,代码 将按预期工作。对于其他编译器,每调用一次子程序 就会得到完整的垃圾。

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

正确答案是保存变量并用数据语句初始化它。 这是便携式,将在每个系统上工作。