4

我正在研究科学建模程序,甚至还没有让我的程序编译。我没有碰过我的教授坚持以前工作的代码,只有makefile。经过多次尝试,我得到的最远的是这个错误:

Error on line 1112: Declaration error for xxmf: adjustable dimension on non-argument
   upcase:
   intrpl:
   splin:
   mtrnpr:

我的教授坚持认为这只是一个编译问题,应该有一些涉及全局变量的选项,我可以使用它来解决这个问题。我发现的最接近的是使用该选项

 -Mipa=safeall

在makefile中,但我不确定我是否将它放在正确的位置,或者它是否有所作为,因为我仍然遇到同样的错误。

4

1 回答 1

12

Oof -- 听起来你有一个旧代码可以很好地与你的主管的特定版本的古代 f77 编译器一起工作,但是当你慢慢地将它提升到标准以便标准编译器会做正确的事。

可调数组是这样的:

subroutine mysub(a,n)
integer n
real a(n)

-- 也就是说,传递数组的方式或多或少与您在 C 中的方式相同。Fortran90 及更高版本允许您使用假定形状的数组

subroutine mysub90(a)
real a(:)
n=size(x,1)

这更干净,因为编译器确保传递正确大小的数组。

所以听起来你的主管的代码正在使用这种结构,而不是子例程中的参数,大概是作为在运行时创建特定大小的数组的一种方式。标准 Fortran77 从未允许这样做,但有几个编译器将其作为扩展。幸运的是,您现在可以使用可分配数组作为执行此操作的标准方法,因此我建议您现在将变量更改为可分配数组。

顺便说一句,有很多静态代码分析工具可以让您主动发现此类问题并进行跟踪。 理解是一个很好的商业版本,有大约 2 周的评估许可证,会发现很多问题。 Forcheck虽然不像用户友好,但非常彻底。使用像这样的工具将你的主管代码踢和尖叫拖到 2010 年代会有点困难,但这将是你时间的一项极好的投资。另一组很好的工具是 eclipse + photran,但不幸的是,这已经大多假设你有很好的 fortran90 代码——你还需要一段时间才能使用它。

(在任何人开始对 fortran 发表尖刻评论之前——是的,是的,那里有很多旧的蹩脚的 fortran 代码,但现在这几乎不是 fortran 独有的,不是吗。)

于 2011-02-21T21:51:10.843 回答