是否应该在Fortran中声明外部例程?

时间:2010-03-12 03:53:14

标签: fortran external declaration

在我的Fortran代码中,我对dnrm2例程进行了以下调用:

d = dnrm2(n, ax, 1)

只需一个简单的调用即可返回double precision个结果。

问题是,我应该在脚本开头声明函数吗?我发现如果我没有声明它,当我在32位Windows中编译代码时,结果是正确的。

但如果我在64位Windows中编译代码,则结果不正确。

为什么会这样?是否必须在Fortran中声明外部例程?

2 个答案:

答案 0 :(得分:3)

如果未正确描述调用程序的子程序(子程序和函数),编译器可能无法正确调用它们。 Fortran单独编译每个单元,因此编译器默认情况下不会“知道”其他子程序的特征。您可以通过多种方式在Fortran 90/95/2003中描述/声明子程序。

最简单和最好的方法是将子程序放入模块中,然后在调用程序中“使用”该模块。这会自动使编译器知道接口,并使编译器能够检查子程序中实际参数(在调用中)和伪参数的一致性。它还将知道函数的返回类型。模块中的各个子程序的接口彼此已知。

您还可以编写一个“接口”,其中包含与实际子程序的声明匹配的子程序声明。 (此方法可能与C中包含头文件的样式非常相似。)此方法工作量大,容易出错,因为必须手动维护实际子程序和接口之间的一致性。当您没有子程序的代码或子程序是用Fortran以外的语言编写时,接口方法很有用。

或者你可以简单地声明一个函数名来指定函数的类型返回,但这不会给你任何参数检查。在我看来,这种方法较弱,因为编译器检查参数一致性消除了一大类编程错误。

答案 1 :(得分:-1)

我不做Fortran,但在C中,指针的大小和long int的大小在32位和64位OS之间变化,但是int的大小却没有。也许该程序正在使用int来进行指针运算?