fortran arrays in gdb
Patrick Alken
patrick.alken@colorado.edu
Sat Mar 3 22:00:00 GMT 2007
Hello,
I am trying to call fortran subroutines from C and then step
through the fortran code with gdb. Unfortunately, gdb (version 6.5)
cannot properly display the contents of 2D arrays passed to the fortran
routine. I have created 2 simple files:
mat.c - a C program which calls the fortran routine with a 4x4 matrix
testmat.f - a fortran77 subroutine which prints out the matrix
These were compiled with:
g77 -g -Wall -c testmat.f
gcc -g -Wall -o mat mat.c testmat.o -lg2c
Here is the output of the program (which is correct):
> ./mat
a( 1, 1) = 1.
a( 1, 2) = 5.
a( 1, 3) = 9.
a( 1, 4) = 13.
a( 2, 1) = 2.
a( 2, 2) = 6.
a( 2, 3) = 10.
a( 2, 4) = 14.
a( 3, 1) = 3.
a( 3, 2) = 7.
a( 3, 3) = 11.
a( 3, 4) = 15.
a( 4, 1) = 4.
a( 4, 2) = 8.
a( 4, 3) = 12.
a( 4, 4) = 16.
Now here is the problem: when I step through the fortran subroutine
with gdb and try to print out individual array values, it gives
incorrect results:
> gdb mat
...
(gdb) break testmat_
Breakpoint 1 at 0x8048592: file testmat.f, line 1.
(gdb) r
Starting program: /home/cosine/C/mat
Breakpoint 1, testmat_ (n=0xbfa83ecc, a=0xbfa83ed0) at testmat.f:1
1 subroutine testmat(n,a)
Current language: auto; currently fortran
(gdb) n
6 do 10 i = 1, n
(gdb) p a(2,2)
$1 = 3
(gdb) p a(4,3)
$2 = 6
(gdb) p a(3,4)
$3 = 6
(gdb)
By comparing this with the correct output from calling the program,
we know that a(2,2) should in fact be 6, not 3. a(4,3) should be 12,
not 6, and a(3,4) should be 15, not 6.
Can someone please tell me if there is a way to correct this problem.
I really need to be able to step through fortran code and be able
to rely on the gdb output. Please help!
Patrick Alken
-------------- next part --------------
#include <stdio.h>
void testmat_(int *n, double *A);
int main()
{
double data[] = { 1.0, 2.0, 3.0, 4.0,
5.0, 6.0, 7.0, 8.0,
9.0, 10.0, 11.0, 12.0,
13.0, 14.0, 15.0, 16.0 };
int n = 4;
testmat_(&n, data);
return 0;
}
-------------- next part --------------
subroutine testmat(n,a)
c
integer n, i, j
double precision a(n,n)
do 10 i = 1, n
do 20 j = 1, n
print *, 'a(', i, ',', j, ') =', a(i,j)
20 continue
10 continue
return
end
More information about the Gdb
mailing list