对于不属于标准的 FORTRAN 内在函数,我该怎么办?
Posted
技术标签:
【中文标题】对于不属于标准的 FORTRAN 内在函数,我该怎么办?【英文标题】:What do I do about a FORTRAN intrinsic that was not part of the standard? 【发布时间】:2011-05-03 21:59:57 【问题描述】:我正在尝试使用 gfortran 从源代码构建旧版 FORTRAN 代码。我终于能够成功构建它,但是现在它运行时出现了越界错误。我使用 gdb 并将错误跟踪到使用 loc() 内部函数的函数。当我尝试打印 loc(ae)
的值时,其中 ae 是我传递的整数值,我收到错误“当前上下文中没有符号“loc”。”我尝试使用 ifort 11.x 进行编译并使用 DDT 进行调试并得到相同的错误。对我来说,这意味着编译器对内在函数一无所知。
稍微阅读后发现 loc 内在函数不是 F77 标准的一部分,所以这可能是问题的一部分。我在下面发布了内在函数的定义,但我不知道如何将其实现到我的代码中,以便可以使用 loc()。
有什么建议还是我误解了我的问题?因为 gfortran 和 ifort 由于越界错误而在同一个地方崩溃,但是使用 loc() 的函数在两个编译器之间返回相同的大数字。如果两个编译器都返回相同的 loc 值,那么 loc() 将不起作用,这似乎有点奇怪。
用法:
iaddr = loc(obj)
地点:
对象 是需要其地址的变量、数组、函数或子程序。 地址 是一个地址为“obj”的整数。地址是一样的 LARn 存储的格式 说明。
说明:
LOC用于获取地址 某物。返回的值不是 在 Fortran 中非常有用,但可能 GMAP 子程序需要,或 很特别的调试。
【问题讨论】:
【参考方案1】:嗯,不,它编译的事实意味着编译器知道loc
; gdb 不知道它的事实只是意味着调试器不知道它(它可能也不知道 matmult
内在函数)。
loc
是一个广泛使用的非标准扩展。我讨厌那些。如果您想要在任何地方都可以使用的标准,那么您可以使用 c_loc,它是 Fortran2003 中 CFortran 互操作性标准的一部分。它返回一个可以传递给 C 例程的指针。
如何使用来自 loc 调用的值?
【讨论】:
感谢您的回复。进一步调查显示我 loc 可能不是问题所在。我有 2 个使用 Compaq VF 6.1 构建的代码版本,一个忽略了“数组越界”错误,一个因此而停止运行。我使项目设置完全相同,但行为仍在继续。我无法弄清楚这一点,可能只需要移动到 Windows 并使用正在运行的预先存在的可执行文件。再次感谢。【参考方案2】:Gfortran loc 对数组的工作似乎与其他一些编译器略有不同。如果您使用它来检查数组副本等,那么最好对第一个元素 loc(obj(1,1)) 或类似元素进行 loc。这等同于我对 intel 的 loc 的看法,但在 gfortran 中它提供了一些其他地址(因此共享完全相同的内存布局的两个数组具有不同的 loc 结果)。
【讨论】:
以上是关于对于不属于标准的 FORTRAN 内在函数,我该怎么办?的主要内容,如果未能解决你的问题,请参考以下文章