[fpc-pascal] FORTRAN from FreePascal

Adriaan van Os fpc at microbizz.nl
Mon Nov 13 16:20:11 CET 2017


brian wrote:
> Anyone with any past experience here? It seems I have two choices, to
> try to call the FORTRAN subroutines from FreePascal or to port the
> FORTRAN code to Pascal, I'm looking for advice...

It is no problem calling FORTRAN from either C or FreePascal (or at least not on UNIX-like 
platforms like Mac OS X, havn't tried for Windows). The LAPACK package 
<http://www.netlib.org/lapack/> for example (also installed in the Mac system software) is written 
in Fortran. Some key points:

1. Lapack Fortran arrays are column-major (where column elements are contiguous in memory)
2. Lapack Fortran arrays are 1-base indexed
3. Lapack Fortran parameters are always passed by reference, even if they are value parameters

So, for example, DGETRF

   =====================================================================
       SUBROUTINE DGETRF( M, N, A, LDA, IPIV, INFO )
*
*  -- LAPACK computational routine (version 3.X) --
*  -- LAPACK is a software package provided by Univ. of Tennessee,    --
*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
*     November 2011
*
*     .. Scalar Arguments ..
       INTEGER            INFO, LDA, M, N
*     ..
*     .. Array Arguments ..
       INTEGER            IPIV( * )
       DOUBLE PRECISION   A( LDA, * )
*     ..


  function dgetrf_
    ( constref theNumRows              : LapackInt;
      constref theNumColumns           : LapackInt;
               theMatrixPtr            : LapackArrayOfDoublePtr;
      constref theLeadingDimension     : LapackInt;
               thePivotIndicesPtr      : LapackArrayOfIntPtr;
           var theInfo                 : LapackInt): LapackResult; cdecl; external;

where (it's just an example)

     LapackInt                         = Int32;
     LapackLongBool                    = Int32;
     LapackResult                      = Int32;
     LapackDouble                      = double;
     LapackArrayOfIntPtr               = ^Int32;
     LapackArrayOfLongBoolPtr          = ^Int32;
     LapackArrayOfDoublePtr            = ^double;

The "constref" for value parameters makes sure they are passed by reference, which is what Fortram 
requires.

Etcetera.

Regards,

Adriaan van Os







More information about the fpc-pascal mailing list