From: Patrick Alken <patrick.alken@colorado.edu>
To: gdb@sourceware.org
Subject: Re: fortran arrays in gdb
Date: Sat, 03 Mar 2007 22:23:00 -0000 [thread overview]
Message-ID: <20070303222319.GA20123@hippogriff.physics.drexel.edu> (raw)
In-Reply-To: <20070303220033.GA17346@hippogriff.physics.drexel.edu>
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
next prev parent reply other threads:[~2007-03-03 22:23 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-03-03 22:00 Patrick Alken
2007-03-03 22:23 ` Patrick Alken [this message]
2007-03-05 12:33 ` Daniel Jacobowitz
2007-03-05 17:01 ` Patrick Alken
2007-03-05 17:09 ` Daniel Jacobowitz
2007-03-05 18:59 ` Patrick Alken
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20070303222319.GA20123@hippogriff.physics.drexel.edu \
--to=patrick.alken@colorado.edu \
--cc=gdb@sourceware.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox