我正在尝试修改一个非常大的Fortran遗留代码(fortran77),但由于代码的作者不关心写评论而且也没有使用适当的缩进等,我在修改时遇到了很大的困难代码。我需要的是某种方式(包或命令行工具),如果我在它开始的地方显示它,它将使我能够识别给定构造的结束,如if-then
或do-enddo
。例如:
if(x .eq. 0)then
if (y .eq. 0)then
print*, y
endif
endif
假设我想看看第一个if语句的结束位置,那么这个工具应该显示最后一行,依此类推。
如果有任何帮助,我将非常感激。提前致谢。
答案 0 :(得分:2)
以下是两种做你想做的事情:
http://www.polyhedron.com/pf-plusfort0html
https://sourceforge.net/projects/findent/files/
另一个是(自己)一个小代码来缩进FORTRAN文件。这并不困难:))
答案 1 :(得分:0)
在堡垒中有如下标记构建体(它可能是F90中的标准):
Cat_Loop:
&DO I = 1, N
!<stuff>
Dog_Loop: DO K = 1, M, 9 !Because Dogs are canines!
!<stuff>
Lizard_Loop:
& DO J = 1, M
!<stuff>
ENNDO Lizard_Loop
ENNDO Dog_Loop
ENDDO Cat_Loop
在IF语句通常所在的位置,SELECTED CASE有时很有用。这是另一个90标准:
SELECTED CASE (Dog)
CASE(-9)
<Stuff>
!ENDCASE
CASE(1)
<Stuff>
!ENDCASE
CASE(2)
<Stuff>
!ENDCASE
CASE(9)
<Stuff>
ENDCASE
DEFAULT
WRITE(*,*)' Why am I here with Dog=',Dog
ENDCASE
END SELECT
我要做的第一件事就是为已知输入捕获一些输出,然后构建一些单元测试的方法&#39;它。 并定期确保你坚持走近它的道路。
答案 2 :(得分:-1)
你有什么特别的理由限制自己使用Fortran 90;它已有近三十年的历史。现代Fortran允许控制结构的标识符,exit
不再局限于do
循环,并且goto
最终被使用Fortran 2008 block
构造弃用。
alpha: block
bravo: do i = 1, num_in_set
charlie: if (x == a(i)) then
delta: select case (i)
case (FIRST)
call do_something(x)
case (SECOND)
call do_something_else(x)
case (THIRD)
cycle bravo
case default
exit alpha
end select delta
else if (x == a(i+1)) then
x = foo(a)
else
x = bar(a)
exit alpha
end if charlie
call finally_do_something(x)
end do bravo
end block alpha