代码都放在工作目录~/octave_workplace/f77下
一、fortran子程序tnine.f
SUBROUTINE TNINE (IOPT, PARMOD, PS, X, Y, Z, BX, BY, BZ) INTEGER IOPT DOUBLE PRECISION PARMOD(10), PS, X, Y, Z, BX, BY, BZ C This is just a test subroutine body, to check connexions. C Put the sum of PARMOD in PS, and X, Y, Z into BX, BY, BZ INTEGER I PS = 0D0 DO 1 I=1, 10 PS = PS + PARMOD (I) 1 CONTINUE BX = X BY = Y BZ = Z END
这里参考了octave自带例子程序examples/fortransub.f
二、c++程序t96.cc
#include <octave/oct.h> #include <octave/f77-fcn.h> extern "C" { int F77_FUNC (tnine, TNINE) (const int& IOPT, const double* PARMOD, double& PS, const double& X, const double& Y, const double &Z, double& BX, double& BY, double& BZ ); } DEFUN_DLD (t96, args, , "- Loadable Function: [PS, BX, BY, BZ] = t96 (PM, X, Y, Z) Returns the sum of PM in PS and X, Y, and Z in BX, BY, and BZ.") { octave_value_list retval; const int dummy_integer = 0; Matrix pm; const double x = args(1).double_value(), y = args(2).double_value(), z = args(3).double_value(); double ps, bx, by, bz; pm = args(0).matrix_value (); F77_XFCN (tnine, TNINE, (dummy_integer, pm.fortran_vec(), ps, x, y, z, bx, by, bz) ); if (f77_exception_encountered) { error ("unrecoverable error in t96"); return retval; } retval(0) = octave_value (ps); retval(1) = octave_value (bx); retval(2) = octave_value (by); retval(3) = octave_value (bz); return retval; }
三、Compile this in the Bourne Again Shell(can also in Octave) and run it in Octave like:
>> mkoctfile t96.cc tnine.f >> [p, x, y, z] = t96 (1:10, sqrt (2), pi, e) p = 55 x = 1.4142 y = 3.1416 z = 2.7183 >>