2010-03-12 104 views
1

在我的Fortran代码我做了如下调用dnrm2常规:应该在Fortran中声明外部例程吗?

d = dnrm2(n, ax, 1) 

只是一个简单的调用,将返回我double precision结果。

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

但是,如果我在64位Windows编译代码,那么结果是不正确的。

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

+0

什么? downvote?我的问题有什么问题? – Graviton 2010-03-27 16:41:27

+0

+1:这是一个有趣的问题 - downvote对我毫无意义。 – 2010-03-28 06:31:06

回答

3

如果您没有正确描述调用程序的子程序(子例程和函数),编译器可能无法正确调用它们。 Fortran分别编译每个单元,因此编译器默认不会“知道”其他子程序的特性。有几种方法可以在Fortran 90/95/2003中描述/声明子程序。

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

您也可以编写一个包含子程序声明的“接口”,该子程序声明与实际子程序的声明相匹配。 (这种方法可以与C中包含头文件的风格非常相似)。这种方法更加容易出错,因为无论何时进行更改,您都必须手动保持实际子程序和接口之间的一致性。当您没有代码到子程序或子程序用Fortran以外的语言编写时,该接口方法很有用。

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

-1

我不做Fortran,但在C中,指针的大小和long int的大小在32位和64位操作系统之间不同,但int的大小不一样。也许程序使用ints来做指针算术?

+2

好的,但是这与我的问题有什么关系? – Graviton 2010-03-12 04:02:49