I merged the pull request from mcg1969 who contributed C version of dotwrp several months ago. He created a more capable package called vecLibFort. I created a port of vecLibFort for MacPorts.
vecLibFort works fine on various version of OS X from Snow Leopard through Mavericks. However I encountered a problem on a PowerPC machine running Leopard. It is dated but I still use it because it is a big endian machine and I need Octave and ncl.
The problem is the one I solved with dotwrp in four years ago: complex return value. I get segfault when linked against the C wrapper but I don’t when linked against the Fortran wrapper.
After some Google searches I realize that the returning a struct is involved and architecture dependent. I noticed that the use of C99 complex types solves the problem.
C function works on Intel but fails on PPC:
fcplx addtwoc_(const fcplx *x, const fcplx *y)
{
fcplx z;
z.r = x->r + y->r;
z.i = x->i + y->i;
return z;
}
Modified C function works on both#include
float complex addtwoc_(const float complex *x, const float complex *y)
{
float complex z;
z = *x + *y;
return z;
}
The caller program in Fortran program main
complex x, y, z, addtwoc
x = (1.0, 2.0)
y = (2.0, 2.0)
z = addtwoc(x, y)
print *, "z = ", z, " x+y=", x+y
end
0 件のコメント:
コメントを投稿