FORTRAN and C Character String and Integer Array

Last reviewed: July 20, 1995
Article ID: Q63308
The information in this article applies to:
  • Microsoft FORTRAN for MS-DOS, versions 5.0 and 5.1
  • Microsoft FORTRAN for OS/2, versions 5.0 and 5.1

SUMMARY

The following code is designed to show passing arrays and character strings from FORTRAN to C and from C to FORTRAN.

MORE INFORMATION

There are two programs here. The first has a FORTRAN main and C subroutine; the second a C main and FORTRAN subroutine. Each program does essentially the same thing -- passes an array of 5 INTEGER*4 and a character string to the subroutine, which then prints the values.

C version 6.0 and FORTRAN version 5.0 were used in this example. FORTRAN needs to be built with C compatible libraries, and the modules need to be linked with the /NOE switch. Each module needs to be compiled with the same floating-point and memory-module options (for example, /AL /FPi).

The following is the FORTRAN main:

Sample Code (.for)

C Note that the passed string has a zero length C style string C appended so that it appends a NULL terminating character.

      INTERFACE TO SUBROUTINE CPRINT [C] (I,STRING)
      INTEGER*4 I [REFERENCE]
      CHARACTER*(*) STRING [REFERENCE]
      END

      PROGRAM FMAIN

      INTEGER*4 I(5)
      CHARACTER*255 PRINTSTRING /'This example shows passing an array an
     +d a string.'/

      I(1) = 5
      I(2) = 4
      I(3) = 3
      I(4) = 2
      I(5) = 1


      CALL CPRINT(I,PRINTSTRING//''C)

      END


The following is the start of the C subroutine:

Sample Code (.c)

#include <stdio.h>

void cprint(long int i[], char * printstring)
{
  int count;

  printf("\n");
  for (count = 0; count < 5;count++)
    printf("\t%li",i[count]);
  printf("\n");

  printf("%s",printstring);
}

The following is the start of the C main program:

Sample Code (.c)

extern void fortran fprint (long int *, char *);

main () {

    long int i[5];
    char printstring[255] = "This example shows passing an array and"
                            " a string.";

    i[0] = 5;
    i[1] = 4;
    i[2] = 3;
    i[3] = 2;
    i[4] = 1;

    fprint(i,printstring);
}

The following is the start of the FORTRAN subroutine:

Sample Code (.for)

C The declaration of PRINTSTRING has to be equal to or less than the C size of the string passed from C. If it is not, other data will get C accessed, possibly causing a protection violation under OS/2.

      SUBROUTINE FPRINT (I,PRINTSTRING)
      INTEGER*4 I(*)
      CHARACTER*255 PRINTSTRING

      INTEGER  J

C The following line truncates the string at the end of the C string. C (The C string end-of-string character is CHAR(0).)
      PRINTSTRING = PRINTSTRING(1:INDEX(PRINTSTRING,CHAR(0)))

      WRITE (*,*) (I(J),J=1,5)
      WRITE (*,*)
C The substring (1:lentrim()) is printed instead of just the C variable because this way only the characters stored in the C variable are printed, and not the entire length of the variable C padded with spaces (255 spaces).
      WRITE (*,*) PRINTSTRING(1:LEN_TRIM(PRINTSTRING))
      END


Additional reference words: kbinf 5.00 5.10 mixed
KBCategory: kbprg kbinterop kbcode
KBSubcategory: FORTLngIss CLngIss


THE INFORMATION PROVIDED IN THE MICROSOFT KNOWLEDGE BASE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. MICROSOFT DISCLAIMS ALL WARRANTIES, EITHER EXPRESS OR IMPLIED, INCLUDING THE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL MICROSOFT CORPORATION OR ITS SUPPLIERS BE LIABLE FOR ANY DAMAGES WHATSOEVER INCLUDING DIRECT, INDIRECT, INCIDENTAL, CONSEQUENTIAL, LOSS OF BUSINESS PROFITS OR SPECIAL DAMAGES, EVEN IF MICROSOFT CORPORATION OR ITS SUPPLIERS HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. SOME STATES DO NOT ALLOW THE EXCLUSION OR LIMITATION OF LIABILITY FOR CONSEQUENTIAL OR INCIDENTAL DAMAGES SO THE FOREGOING LIMITATION MAY NOT APPLY.

Last reviewed: July 20, 1995
© 1998 Microsoft Corporation. All rights reserved. Terms of Use.