Assuming you know what compilers and library names are apropriate on your system, you only need to tell the C compiler to link with the Slatec library and the standard Fortran library. For example:
cc prog.c -lxlf90 -lslatecwhere cc is the C compiler (and linker), -l is the prefix for linking a library, xlf90 is your standard Fortran library, slatec is the name of your Slatec library, and prog.c is your C program.
You may also compile your C code into object files first
(usually with
cc -c prog.cHere you are not required to indicate the linking of the standard Fortran library since f77 will automatically include it!!
f77 prog.o -lslatec
Before proceeding to compiling your first program with a Slatec function call,
you should have compiled and executed
the simple example
in the section
Let us now take a simple Slatec function cpqr79(..). This function finds the zeros of a polynomial. The comments in the source code, cpqr79.f, contains some documentation about this function:
SUBROUTINE CPQR79 (NDEG, COEFF, ROOT, IERR, WORK) C Abstract C This routine computes all zeros of a polynomial of degree NDEG C with complex coefficients by computing the eigenvalues of the C companion matrix. C C Description of Parameters C The user must dimension all arrays appearing in the call list C COEFF(NDEG+1), ROOT(NDEG), WORK(2*NDEG*(NDEG+1)) C C --Input-- C NDEG degree of polynomial C C COEFF COMPLEX coefficients in descending order. i.e., C P(Z)= COEFF(1)*(Z**NDEG) + COEFF(NDEG)*Z + COEFF(NDEG+1) C C WORK REAL work array of dimension at least 2*NDEG*(NDEG+1) C C --Output-- C ROOT COMPLEX vector of roots C C IERR Output Error Code
Here is a short C program that we will use to test our ability to compile C programs that call the Slatec library. For the commented version of this program click here.
#include <stdio.h> #include <math.h> #define REAL float #define DD 48 struct complex {REAL re; REAL im;}; void cpqr79(int*, struct complex*, struct complex*,int*,REAL*); int main() { int ndeg[1]; int ierr[1]; struct complex coeff[3]; struct complex root[2]; REAL work[DD]; int i=0; REAL f; coeff[0].re=1.; coeff[0].im=0.; coeff[1].re=3.; coeff[1].im=0.; coeff[2].re=2.; coeff[2].im=0.; ndeg[0]=2; cpqr79(ndeg, coeff, root, ierr, work); for (i=0;i<ndeg[0];i++ ) printf("(%g,%g).",root[i].re,root[i].im); if (ierr[0]) printf("Error Flag = %d\n",ierr[0]); puts("\n"); return 0; } /* Try compiling with cc simpleCPQ.c -lm -lslatec -lxlf90 */
Try compiling the code above with either of the two methods described
above.