我正在尝试通过使用gfortran从源代码构建它来获取遗留的FORTRAN代码。我终于能够成功构建它,但现在我运行时遇到了越界错误。我使用gdb并将错误跟踪到使用loc()内在函数的函数。当我尝试打印loc(ae)
的值时,ae是我的整数值,我在当前上下文中得到错误“No symbol”loc“。我尝试使用ifort 11.x进行编译并使用DDT进行调试并得到相同的错误。对我来说,这意味着编译器对内在函数一无所知。
有点读数显示,本地内在不是F77标准的一部分,所以也许这是问题的一部分。我在下面发布了内在的定义,但我不知道如何将其实现到我的代码中,因此可以使用loc()。
有任何建议或我是否误解了我的问题?因为gfortran和ifort由于越界错误而在同一个地方崩溃,但是使用loc()的函数在两个编译器之间返回相同的大数。如果两个编译器都为loc返回相同的值,则loc()将无法正常工作,这似乎有点奇怪。
用法:
iaddr = loc(obj)
其中:
OBJ 是一个变量,数组,函数或子程序,其地址是需要的。 iaddr 是一个地址为“obj”的整数。地址是一样的 由LARn存储的格式 指令。
说明
LOC用于获取地址 一些东西。返回的值不是 在Fortran中真的很有用,但可能 需要GMAP子程序,或 非常特别的调试。
答案 0 :(得分:5)
嗯,不,它编译的事实意味着编译器知道loc
;事实上gdb不知道它只是意味着它只是调试器不知道(它可能也不知道matmult
内在函数。)
loc
是一种广泛使用的非标准扩展程序。我讨厌那些。如果您想要一些适用于所有地方的标准,c_loc是Fortran2003中C< - > Fortran互操作性标准的一部分,您可以使用它。它返回一个可以传递给C例程的指针。
如何使用loc调用的值?
答案 1 :(得分:0)
Gfortran loc似乎与其他编译器的数组有点不同。如果您正在使用它来检查数组副本等,那么最好做第一个元素loc(obj(1,1))或类似的loc。这相当于我认为使用intel的loc,但是在gfortran中它提供了一些其他地址(因此两个共享完全相同内存布局的数组具有不同的loc结果)。