我在开源科学代码中添加了一些功能。我使用了很多可分配的东西,但是我在打印它们时遇到了一些麻烦。例如,我声明并分配,然后使用:
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))
,以及如何让它像普通数组一样打印。
答案 0 :(得分:3)
使用
(gdb) print *((real *)A+m)@n
其中A是数组,m是位置的移位(在m = 0的情况下不需要写+ m),n是要打印的元素数。如果你正在使用双精度实数,那么用real_8替换real。此外,对于整数,用int替换real,对于长整数,使用long_int。积分转到http://numericalnoob.blogspot.fr/2012/08/fortran-allocatable-arrays-and-pointers.html
答案 1 :(得分:3)
更新:在Ubuntu 16.04 LTS中开箱即用
这个问题已经讨论了近十年(例如https://sourceware.org/bugzilla/show_bug.cgi?id=9395),并在某些发行版中得到部分修复。我在Ubuntu 14.04 LTS附带的gdb中遇到reported同样的问题。解决方法与Francois Jacq在此处提出的方式类似,但不会破坏dpkg控制的目录。
我使用来自原生Ubuntu repo的外来工具将Fedora(即GNU gdb(GDB)Fedora 7.9-10.fc23)中的gdb RPM转换为.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补丁纳入主流......
请考虑确认您的发行版错误跟踪器中的错误,因此维护人员会更加关注它。
答案 2 :(得分:2)
不幸的是,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
然后我复制了/ usr / local / bin中的gdb可执行程序(使用sudo cp),我很高兴看到它正常工作!