gdb fortran gfortran fortran95

Fortran imprimir matriz asignable en gdb



gfortran fortran95 (3)

ACTUALIZACIÓN: Funciona fuera de la caja en Ubuntu 16.04 LTS

El problema se está discutiendo desde hace casi una década (por ejemplo, https://sourceware.org/bugzilla/show_bug.cgi?id=9395 ) y está parcialmente solucionado en algunas distribuciones. He reported el mismo problema en gdb que viene con Ubuntu 14.04 LTS. La solución fue similar a la que Francois Jacq sugirió aquí, pero sin dañar los directorios controlados por dpkg.

He usado una herramienta alienígena del repositorio nativo de Ubuntu para convertir un gdb RPM de Fedora (a saber, GNU gdb (GDB) Fedora 7.9-10.fc23) en el paquete .deb, y luego usé dpkg para instalarlo. Ahora he instalado gdb-7.9.1-7.1.x86_64.rpm de OpenSUSE de manera similar:

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

En muchos casos funciona correctamente con punteros simples y matrices asignables. Aunque los valores predeterminados de gdb son a menudo cuando se intenta tocar estructuras grandes y / o complejas. Probablemente, es por eso que muchos mantenedores prefieren no incluir el parche fortran en la corriente principal ...

Considere confirmar el error en los rastreadores de errores de su distribución, para que los encargados del servicio le presten más atención.

Estoy agregando algunas funcionalidades a un código científico de código abierto. Trabajo con muchos asignables, pero tengo problemas para imprimirlos correctamente. Por ejemplo, declaro y asigno, y luego uso:

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

Más tarde obtengo un desajuste de matriz y estoy usando gdb para descubrir por qué. Si imprimo:

(gdb) p psi_n_phi $23 = (0)

Pero claramente este no es el caso, como lo demuestra:

(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) )

Obtuve la información sobre el uso de la notación @ de http://numericalnoob.blogspot.co.il/2012/08/fortran-allocatable-arrays-and-pointers.html . Esta es casi la única fuente que puedo encontrar sobre el problema, aunque he visto algunas otras preguntas en las que la gente se encuentra con problemas similares (pero ninguno de ellos pudo solucionarlo).

¿Alguna idea aquí? Me gustaría entender por qué imprimirlo aparece como ((0)) y cómo puedo hacer que se imprima como una matriz normal.


Lamentablemente, el enlace troncal GDB no admite matrices asignables. Pero la rama Archer incluye algo de apoyo.

Hace poco leí la siguiente publicación de Tobias Burnus:

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

Yo trabajo con Ubuntu 14.02. Descargué el paquete más reciente de OpenSUSE rpm de gdb y lo extraje con un comando como

rpm2cpio myrpmfile.rpm | cpio -idmv

Luego copié el programa ejecutable gdb en / usr / local / bin (con sudo cp) y me alegró ver que funcionaba correctamente.


Utilizar

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

donde A es la matriz, m es el desplazamiento en la posición (no es necesario escribir + m en el caso m = 0) yn es el número de elementos que desea imprimir. Si está trabajando con reales de doble precisión, reemplace real por real_8. Además, para enteros, reemplace real por int, y para enteros largos use long_int. El crédito va a http://numericalnoob.blogspot.fr/2012/08/fortran-allocatable-arrays-and-pointers.html