Microsoft KB Archive/63308

= FORTRAN and C Character String and Integer Array =

Article ID: 63308

Article Last Modified on 12/1/2003

-

APPLIES TO


 * Microsoft FORTRAN Compiler 5.0
 * Microsoft FORTRAN Compiler 5.1
 * Microsoft FORTRAN Compiler 5.0
 * Microsoft FORTRAN Compiler 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)

 * 1) include 

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

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

printf(&quot;%s&quot;,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] = &quot;This example shows passing an array and&quot; &quot; a string.&quot;;

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 query words: nofps kbinf 5.00 5.10 mixed

Keywords: KB63308

-

[mailto:TECHNET@MICROSOFT.COM Send feedback to Microsoft]

© Microsoft Corporation. All rights reserved.