【问题标题】:Fortran print allocatable array in gdbFortran在gdb中打印可分配数组
【发布时间】:2015-05-26 12:40:37
【问题描述】:

我正在向开源科学代码添加一些功能。我使用了很多可分配对象,但是在正确打印它们时遇到了一些麻烦。比如我声明并分配,然后使用:

real(dp), allocatable :: psi_n_phi(:)
! some other stuff here
allocate(psi_n_phi(1:fock_info%nocc(isp)))
! nocc(isp) is simply equal to 1 in this context
! some other stuff here
do n = 1, fock_info%nocc(isp)
    psi_n_phi(n) = dot_product(fock_info%psi(:, n, isp), p)
enddo

我后来得到一个数组不匹配,我正在使用 gdb 找出原因。如果我打印:

(gdb) p psi_n_phi 
$23 = (0)

但显然情况并非如此,如下所示:

(gdb) p psi_n_phi@1
$25 = (( 0) )
(gdb) p psi_n_phi@2
$26 = (( 0) ( 0) )
(gdb) p psi_n_phi@10
$28 = (( 0) ( 0) ( 0) ( 2.0162819006781271e-320) ( 2.2600760244771319e-316) ( 2.3792209431030402e-316) ( 6.9179818424594845e-310) ( 2.2598704931684619e-316) ( 6.9179818424672413e-310) ( 0) )

我从http://numericalnoob.blogspot.co.il/2012/08/fortran-allocatable-arrays-and-pointers.html 获得了有关使用@ 表示法的信息。这只是我能找到的关于这个问题的唯一来源,尽管我看到了一些其他问题,人们遇到了类似的问题(但没有一个能够解决它)。

这里有什么想法吗?我想了解为什么将它打印为((0)),以及如何让它像普通数组一样打印。

【问题讨论】:

    标签: gdb fortran gfortran fortran95


    【解决方案1】:

    使用

    (gdb) print *((real *)A+m)@n
    

    其中 A 是数组,m 是位置的偏移(在 m=0 的情况下不需要写 +m),n 是要打印的元素数。如果您使用双精度实数,则将 real_8 替换为 real_8。此外,对于整数,用 int 替换 real,对于长整数,使用 long_int。归功于http://numericalnoob.blogspot.fr/2012/08/fortran-allocatable-arrays-and-pointers.html

    【讨论】:

      【解决方案2】:

      更新:在 Ubuntu 16.04 LTS 中开箱即用

      这个问题已经讨论了将近十年(例如https://sourceware.org/bugzilla/show_bug.cgi?id=9395),并且在某些发行版中得到了部分修复。我在 Ubuntu 14.04 LTS 附带的 gdb 中有 reported 相同的问题。解决方法与 Francois Jacq 在此处建议的方式类似,但不会损坏 dpkg 控制的目录。

      我使用了来自本地 Ubuntu repo 的外星工具将一个 gdb RPM 从 Fedora(即 GNU gdb (GDB) Fedora 7.9-10.fc23)转换为 .deb 包,然后使用 dpkg 安装它。现在我以类似的方式从 OpenSUSE 安装了 gdb-7.9.1-7.1.x86_64.rpm:

      fakeroot alien gdb-7.9.1-7.1.x86_64.rpm
      sudo dpkg -i gdb_7.9.1-8.1_amd64.deb
      

      在许多情况下,它可以与简单的指针和可分配数组一起正常工作。尽管 gdb 的段错误通常是在尝试触及大型和/或复杂结构时。可能这就是为什么许多维护者不愿意将 fortran 补丁纳入主流的原因......

      请考虑在您的发行版错误跟踪器中确认该错误,以便维护人员更加关注它。

      【讨论】:

        【解决方案3】:

        不幸的是,GDB 主干不支持可分配数组。但是 Archer 分支包含一些支持。

        我最近阅读了 Tobias Burnus 的以下帖子:

        https://gcc.gnu.org/ml/fortran/2012-09/msg00013.html

        我使用 Ubuntu 14.02。我下载了 gdb 的最新 OpenSUSE rpm 包,并通过类似

        的命令将其解压缩
        rpm2cpio myrpmfile.rpm | cpio -idmv
        

        然后我将 gdb 可执行程序复制到 /usr/local/bin 中(使用 sudo cp),我很高兴看到它正常工作!

        【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-30
        • 1970-01-01
        • 2015-11-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多