[fpc-pascal] FORTRAN from FreePascal

brian brian at meadows.pairsite.com
Mon Nov 13 16:53:04 CET 2017


On 11/13/2017 10:20 AM, Adriaan van Os wrote:
> 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.
> 

Thanks, Adriaan, that's exactly what I needed. :)  I'm going to be
writing for a Debian platform (I should have mentioned that, the
original code is from a Unix minicomputer) so there hopefully
shouldn't be a problem. If I can just chunk up some of the FORTRAN
code and re-use the calculation routines (which I don't understand
anyway, the statistics are at a level that's over my head) then it
will make life a lot easier.


Brian.




More information about the fpc-pascal mailing list