FORTRAN and C Character String and Integer Array (63308)



The information in this article applies to:

  • Microsoft FORTRAN Compiler for MS-DOS 5.0
  • Microsoft FORTRAN Compiler for MS-DOS 5.1
  • Microsoft FORTRAN compiler for OS/2 5.0
  • Microsoft FORTRAN compiler for OS/2 5.1

This article was previously published under Q63308

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
				

Modification Type:MajorLast Reviewed:12/1/2003
Keywords:KB63308