2011-05-25 89 views
5

我在读一些Fortran代码,以前的程序员每次都会在语句'n = n'中引发。这样做的目的是什么?一些示例代码:'n = n'的目的是什么?

if (cmult.lt.5.) then 
    kx = 0 
    do k=ipd(ii),lpd(ii) 
     kx = kx + 1 
     p1(kx) = epp_rfc(ipp,k) 
     epp_rfc(ipp,k) = cmult*epp_rfc(ipp,k) + x 
     zero(ix) 
     p2(kx) = epp_rfc(ipp,k) 
     n = n 
    enddo 

if (cmult.gt.0.) then 
    n = n 
endif 

else 
    nk = lpd(ii) - ipd(ii) + 1 
    do k=ipd(ii),lpd(ii) 
     kx = kx + 1 
     p1(kx) = epp_rfc(ipp,k) 
     epp_rfc(ipp,k) = pp(imem) + zero(ix) 
     p2(kx) = epp_rfc(ipp,k) 
     n = n 
    enddo 
endif 

回答

14

这样的代码经常用于允许程序员在调试器中设置不支持条件断点的断点。

通过设置在该行断点,它只会被击中,如果cmult.gt.0.

+0

你是怎么知道这件事的?这非常有趣。 – tofutim 2011-05-25 14:20:55

+1

+1,@tofutim大多数FORTRAN调试器都不如.Net那么好,所以这些“黑客”很多都很常见。我已经在大多数语言中看到这些结构,其中'write' /'printf'调试很常见。 – user7116 2011-06-03 13:42:53

1

n = n用于检查的cmult.gt.0.的价值和作为“条件断点”事实上在某种意义上,它是巧合不是上述代码片段中出现n = n的原因。

在这种情况下使用n = n的真正原因在于,源代码中的范围绝不会被最流行的编译器翻译成汇编语言(计算机不够聪明,无法理解“范围”除非程序员明确编程,否则程序运行速度会慢100倍......因为为支持范围界定逻辑发出的额外指令)。它只是在那里限制源代码中的程序员,并向代码中引入结构,以便链接器编译器可以完成他们的工作 - 或者如果违反作用域,则发出错误。

因为范围不存在enddo不能被暂停,除非comipler注意插入一些指令(如nop)并调试它的符号以便奇迹般地允许调试器在enddo处停止。如果没有n = n,则该行p2(kx) = epp_rfc(ipp,k)的结果无法检查,因为值在循环的顶部重置。这就是为什么n = n用于在p2(kx) = epp_rfc(ipp,k)之后停止并检查每次迭代的最终结果。经过它时,这个代码来了:

if (cmult.gt.0.) then 
    n = n 
endif 

用于方便(你又不能停在ENDIF要不然)的目的,是的,这是怎么样的条件断点。但是,N = N再次被使用,因为你不能检查if (cmult.gt.0.)后停止- 你可以在它停止后不它 - 下一条指令会外的if else后。我希望这是有道理的。

编辑:如果仍然没有什么太大的意义在这里的附加信息:为了检查p2(kx)p2(kx) = epp_rfc(ipp,k)后的值执行了调试器发出指令,以检查/获取它 - 因此,需要知道a)p2(kx)的大小是多少b)它的位置 - 记住最后的指令!和c)发出适当的指令来取值p2(kx)。对于调试器来说,所有这些都很复杂,因为这实际上是逻辑 - 调试器必须是'智能'(属于AI域),如果调试器可以做到这一点,那么现在终结器就已经存在了。

相关问题