This is the mail archive of the gdb@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: fortran arrays in gdb


Hi again,

  Interestingly, I can get correct results using the following method:

(gdb) p a
$76 = (PTR TO -> ( real*8 (1,1))) 0xbfa83ed0
(gdb) p *((double*)0xbfa83ed0 + 1 + 1*4)
$78 = 6

where I just printed out a(2,2), so in other words, I can use

(gdb) p *((double*)0xbfa83ed0 + r + c*4)

where 'r' is the row I want and 'c' is the column I want. So
why won't the a(r,c) syntax work?

On Sat, Mar 03, 2007 at 03:00:33PM -0700, Patrick Alken wrote:
> 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
> 

> #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;
> }

>       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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]