我正在阅读一些Fortran代码,并且以前的程序员经常会抛出语句'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
答案 0 :(得分:14)
这样的代码经常用于允许程序员在不支持条件断点的调试器中设置断点。
通过在该行上设置断点,只有在cmult.gt.0.
答案 1 :(得分:1)
n = n
用于检查cmult.gt.0.
的值并用作'条件断点'的事实在某种意义上是巧合的,因为它不是上述代码中出现n = n的原因片段。
在这种情况下使用n = n的真正原因在于源代码中的范围永远不会被最流行的编译器转换为汇编语言(计算机不够聪明,无法理解'范围'是什么除非它由程序员明确编程,如果它确实执行程序将运行100秒的时间更慢...因为逻辑支持范围的额外指令)。它只是限制程序员在源代码中引入一个结构到代码,以便链接器和编译器可以完成他们的工作 - 如果违反范围,则会发出错误。
因为作用域不存在enddo
无法暂停,除非编译器注意插入一些指令(如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的大小是什么b)它的位置 - 记住最后的指令! c)发出适当的指令以获取值p2(kx)
。所有这些都是复杂的调试器,因为这实际上是逻辑 - 调试器必须是'智能'(属于AI域),如果调试器可以这样做,那么终结者现在就已存在。