Hi, list, I've run into a certain problem with accessing a Fortran subroutine from C. I thouhgt that I could just look up the symbols and make some header for the C function which calls the Fortran subroutine. My Fortran sub is called SolveT, and is found in a module called Toeplitz_Solver. I looked up the symbol in the compiled binary; it's toeplitz_solver_mp_solvet_
The makefile compiles the two things separately: $(F90) -shared -o libsft.a $(FFLAGS) Toeplitz_Solver.o verbose.o timing.o ratintnf.o precision.o $(DFFT)
so I compile my Fortran code together, (using the intel fortran compiler) into a library that I'm calling libsft.a Similarly, I put the C code together in another object: gcc $(LINUXINCLUDE) $(LINUXCFLAGS) -o controlfreak~.o -c controlfreak~.c
and link them: ld -export-dynamic -shared -o controlfreak~.pd_linux ... controlfreak~.o -lsft -lfftw3f -lc
controlfreak~.c has the following header for using this:
extern void toeplitz_solver_mp_solvet_(integer * , double *, double *, integer *, double *);
I figured since Fortran passes by reference, I would need to define all my variables as pointers. The usage, looks like this,
toeplitz_solver_mp_solvet_(&tempn,XT,m,&itref,&factorref);
where XT and m are arrays, tempn, itref, and factorref are parameters. m is also the return array for the operation. I've checked it out with valgrind, and the error which pops up, before seg fault, is
==3735== Invalid read of size 8 ==3735== at 0x1C583F6D: toeplitz_solver_mp_solvet_ (in /usr/local/lib/pd/extra/controlfreak~/libsft.a) ==3735== by 0x1B91995F: controlfreak_tilde_perform (in /usr/local/lib/pd/extra/controlfreak~/controlfreak~.pd_linux) ==3735== by 0x80A5859: dsp_tick (d_ugen.c:304) ==3735== Address 0x0 is not stack'd, malloc'd or (recently) free'd
==3735== Process terminating with default action of signal 11 (SIGSEGV) ==3735== Access not within mapped region at address 0x0 ==3735== at 0x1C583F6D: toeplitz_solver_mp_solvet_ (in /usr/local/lib/pd/extra/controlfreak~/libsft.a) ==3735== by 0x1B91995F: controlfreak_tilde_perform (in /usr/local/lib/pd/extra/controlfreak~/controlfreak~.pd_linux) ==3735== by 0x80A5859: dsp_tick (d_ugen.c:304)
So, I think I've got the right form for the function prototype. It apparently calls solvet, but I wonder what's going wrong to put that Adress 0x0 in there.
Chuck