4

我正在尝试通过使用 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 子例程或非常特殊的调试。

4

2 回答 2

5

好吧,不,它编译的事实意味着编译loc 知道;gdb 不知道它的事实只是意味着调试器不知道它(它可能也不知道matmult内在函数)。

loc是一个广泛可用的非标准扩展。我讨厌那些。如果您想要在任何地方都可以使用的标准,那么您可以使用c_loc,它是 Fortran2003 中 C<->Fortran 互操作性标准的一部分。它返回一个可以传递给 C 例程的指针。

如何使用 loc 调用的值?

于 2011-05-03T22:05:53.057 回答
0

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

于 2011-05-04T08:16:35.427 回答