debugging - Gfortran:将所有 block 视为 block

标签 debugging fortran gfortran

我需要调试一个包含 forall block 的程序。它们的内部是pure子例程或函数。为了暂时禁用 pure 谓词,我使用 C 预编译器,如我提出的以下问题所示:

Gfortran: Treat pure functions as normal functions for debugging purposes?

现在的问题是,如果 forall block 内的子例程或函数不是 pure 我会收到编译错误。是否有可能处理这些错误

Error: Reference to non-PURE function 'pvkp' at (1) inside a FORALL block

仅作为警告,或者是否有可能使用 C 预编译器进行转换

forall (i=1:n)
   ...
end forall

进入

do i=1,n
   ...
end do 

任何想法都值得赞赏!

最佳答案

一种简化方法是使用 do并发 循环而不是 forall block 。这减少了代码中所需的链接更改的数量:只需更改循环规范,而不是将 end forall 更改为 end do

一种不值得骄傲的方法,使用cpp,并且仅适用于简单的情况:

#ifdef DEBUG
#define conloop(var, lower, upper) do var=lower, upper
#else
#define conloop(var, lower, upper) do concurrent (var=lower:upper)
#endif

  conloop(i,1,n)  ! Either a DO or DO CONCURRENT depending on DEBUG
  ...
  end do
end

如果这确实是您想要的,上面确实有使用 forall 构造的明显扩展(带有额外的 #define 结尾)。或者,虽然制作起来比较乏味,但可以使用诸如

#ifdef DEBUG
do i=1,n
#else
forall (i=1:n)
#endif
  ...
#ifdef DEBUG
end do
#else
end forall
#end

这太可怕了,但我想这对于所有预处理器方法都是如此。它确实允许更复杂的蒙版并且更加本地化。

关于debugging - Gfortran:将所有 block 视为 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21647064/

相关文章:

java - 如何设置 JDI 启动连接器?

c++ - 窗口老是失效怎么调试?

c - Atof 不能在 C 中工作,没有 atof 也不能在调试中工作

fortran - fortran 中的打开语句

arrays - fortran90 或 gfortran 的约定 - 整数、实数、 double 和数组的声明

c# - 如何使用COM接口(interface)调试应用程序?

oop - 使用延迟和不可重写过程和 gcc 编译器面向对象的 Fortran 中的不确定行为

pointers - Fortran 90 数组按引用传递问题

fortran - FORTRAN错误#6404 : This name does not have a type,,并且必须具有显式类型

gfortran - 如何找出使用了哪个编译器 : g77 or gfortran