对于不属于标准的FORTRAN内部版本,我该怎么办?

对于不属于标准的FORTRAN内部版本,我该怎么办?,fortran,legacy,gfortran,intrinsics,Fortran,Legacy,Gfortran,Intrinsics,我试图通过使用gfortran从源代码构建一个遗留的FORTRAN代码来让它工作。我终于能够成功地构建它,但现在当它运行时,我得到了一个越界错误。我使用gdb并将错误跟踪到使用loc()内在函数的函数。当我尝试打印loc(ae)的值时,ae是传递给我的整数值,我得到了错误“当前上下文中没有符号”loc“。我尝试使用ifort 11.x编译,并使用DDT调试,得到了相同的错误。对我来说,这意味着编译器不知道内在的 稍微阅读一下就可以发现loc的内在特性不是F77标准的一部分,所以这可能是问题的一部

我试图通过使用gfortran从源代码构建一个遗留的FORTRAN代码来让它工作。我终于能够成功地构建它,但现在当它运行时,我得到了一个越界错误。我使用gdb并将错误跟踪到使用loc()内在函数的函数。当我尝试打印
loc(ae)
的值时,ae是传递给我的整数值,我得到了错误“当前上下文中没有符号”loc“。我尝试使用ifort 11.x编译,并使用DDT调试,得到了相同的错误。对我来说,这意味着编译器不知道内在的

稍微阅读一下就可以发现loc的内在特性不是F77标准的一部分,所以这可能是问题的一部分。我在下面发布了内在函数的定义,但我不知道如何在代码中实现它,以便使用loc()

有什么建议吗?还是我误解了我的问题?因为gfortran和ifort由于越界错误而在同一位置崩溃,但是使用loc()的函数在两个编译器之间返回相同的大数。如果两个编译器都为loc返回相同的值,那么loc()就不起作用,这似乎有点奇怪

用法:

iaddr=loc(obj)

其中:

obj 是需要其地址的变量、数组、函数或子例程。 iaddr 是一个地址为“obj”的整数。地址在同一个地方 由LARn存储的格式 指示

说明:

LOC用于获取 某物返回的值不正确 在Fortran中非常有用,但可能 GMAP子程序需要,或 非常特殊的调试


不,它编译的事实意味着编译器知道
loc
;gdb不知道这一事实只是意味着调试器不知道它(调试器可能也不知道
matmult
内部代码)

loc
是一种广泛使用的非标准扩展。我讨厌那些。如果您希望某个标准在任何地方都适用,这是Fortran2003中CFortran互操作性标准的一部分,那么您可以使用它。它返回一个可以传递给C例程的指针


如何使用loc调用的值

Gfortran loc在处理数组时似乎与其他一些编译器的工作方式略有不同。如果您使用它来检查数组副本等,那么最好执行第一个元素loc(obj(1,1))的loc或类似操作。这相当于我对intel的loc看法,但在gfortran中,它提供了一些其他地址(因此共享完全相同内存布局的两个阵列具有不同的loc结果)。

感谢您的回复。进一步调查表明,loc可能不是问题所在。我有两个版本的代码是用Compaq VF 6.1构建的,一个忽略了“数组越界”错误,另一个因此停止运行。我使项目设置完全相同,但行为仍在继续。我无法理解这一点,可能只需要移动到windows并使用正在运行的预先存在的可执行文件。再次感谢。