[Rd] Calling FORTRAN function from R issue?

Berwin A Turlach Berwin.Turlach at gmail.com
Tue Mar 6 12:56:08 CET 2012


G'day Berend,

On Tue, 6 Mar 2012 11:19:07 +0100
Berend Hasselman <bhh at xs4all.nl> wrote:

> On 06-03-2012, at 01:21, Dominick Samperi wrote:
[...]
> >    zx[0].r = 1.0; zx[0].i = 0.0;
> >    zx[1].r = 2.0; zx[0].i = 0.0;
> >    zx[2].r = 3.0; zx[0].i = 0.0;

Just noticing that it is always zx[0].i, same with the imaginary part
of zy.  But this is probably not of importance. :)

> I tried calling zdotc  through an intermediate Fortran routine hoping
> it would solve your problem.
[...] 
> Above C routine changed to
[...]
> The fortran subroutine is
> 
> <code>
>       subroutine callzdotc(retval,n, zx, incx, zy, incy)
>       integer n, incx, incy
>       double complex retval, zx(*), zy(*)
>       external double complex zdotc
> 
>       retval = zdotc(n, zx, incx, zy, incy)
> 
>       return
>       end
> </code>
> 
> Made a shared object with
> 
> R CMD SHLIB --output=dozdot.so callzdotc.f czdot.c 
> 
> and ran
> 
> dyn.load("dozdot.so")
> .C("testzdotc")
> 
> with the result 0.0, 0.0

Same here.

Once I change the line

	external double complex zdotc

in your fortran subroutine to

	double complex zdotc

everything works fine and I get as result 14.0, 0.0.

It is long time ago that I was taught (and studied) the FORTRAN 77
standard.  But flipping through some books from that time I thing I
have some inkling on what is going on.  The "external" statement is not
needed here (seems to be used in the sense that C is using the
"external" statement).

Cheers,

	Berwin



More information about the R-devel mailing list