对于不属于标准的FORTRAN内在怎么办?

时间:2011-05-03 21:59:57

标签: fortran legacy gfortran intrinsics

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

2 个答案:

答案 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结果)。