HOWTO: Access FORTRAN COMMON Block Contents From C++

Last reviewed: August 26, 1997
Article ID: Q51614

The information in this article applies to:
  • Microsoft FORTRAN for MS-DOS, versions 4.0, 4.01, 4.1, 5.0, 5.1
  • Microsoft FORTRAN for OS/2, versions 4.1, 5.0, 5.1
  • Microsoft FORTRAN PowerStation for MS-DOS, versions 1.0, 1.0a
  • Microsoft C/C++ version 7.0
  • Microsoft Visual C++ for Windows, versions 1.0, 1.5, 1.51

SUMMARY

An application developed in Microsoft FORTRAN can store data in a COMMON block of memory that has the Microsoft C equivalent of a public structure. An application developed in C can access a FORTRAN COMMON block as an "extern public" structure. The only public symbols in FORTRAN are the names of COMMON blocks and of subprograms. Because FORTRAN does not have a syntax to declare an external COMMON block, FORTRAN code always creates the memory locations for data in a mixed-language programming environment.

The most critical aspect to accessing a COMMON block from C code is using the correct naming convention. In C, all public names must have a leading underscore (_) character; FORTRAN code must declare the underscore explicitly. C and FORTRAN each expect public names to contain only uppercase letters. To enforce the correct naming convention, either use the _fortran attribute on the "extern struct" declaration in the C code or use the [C] attribute on the COMMON block name in the FORTRAN code.

MORE INFORMATION

The following project demonstrates using a FORTRAN COMMON block in an application developed in C. The project uses the _fortran keyword to allow the C code to generate the correct name for the COMMON block. Even though the design of the makefile assumes Microsoft FORTRAN version 5.1 and Microsoft C/C++ version 7.0, the information is generally correct for other versions of these compilers. This project creates a driver program, a FORTRAN subprogram that defines a COMMON block, and a C program that accesses the data in the COMMON block. The driver program is written in FORTRAN, it could have as easily been written in C.

A critical switch used in the C compile line is /Gx-. If this switch is not used, you will not be able to access the common block, unless you use "_far" in the extern declaration, in CFUNC.C as follows:

    extern struct comstruct _fortran _far TEST;

Sample Code #1: FORMAIN.FOR

   C Main driver program
   C Compiler options required: None

         PROGRAM COMMONTEST
         CALL FORSUB
         END

Sample Code #2: FORSUB.FOR

   C A FORTRAN subroutine with a COMMON block
   C Compiler options required: None

         SUBROUTINE FORSUB
         COMMON /TEST/ A, B, C
         REAL A
         INTEGER B
         CHARACTER*1 C

         A = 1.
         B = 2
         C = 'F'
         CALL CFUNC
         PRINT*
         PRINT*, 'IN FORSUB FOLLOWING CALL TO CFUNC'
         PRINT*, 'A IS ', A, '           B IS ', B, '           C IS ', C
         RETURN
         END

Sample Code #3: CFUNC.C

   /*
    * Compiler options needed: None
    */

   // A C function that uses data in the FORTRAN COMMON block

   #include <stdio.h>

   struct comstruct
   {
      float A;
      long  B;
      char  C;
   };

   extern struct comstruct _fortran TEST;

   void _fortran cfunc(void)
   {
      printf("In cfunc\n");
      printf("a is %f, b is %ld, c is %c\n", TEST.A, TEST.B, TEST.C);
      TEST.A = TEST.A + 1.;
      TEST.B = TEST.B + 1;
      TEST.C = 'C';
   }

Sample Code #4: MAKEFILE

   all: test.exe

   formain.obj: formain.for
      fl /c /AL /Od /Zi formain.for

   forsub.obj: forsub.for
      fl /c /AL /Od /Zi forsub.for

   cfunc.obj: cfunc.c
      cl /c /AL /Od /Zi /Gx- cfunc.c

   test.exe: formain.obj forsub.obj cfunc.obj
      link formain forsub cfunc, test, nul, /nod /noe /co \
         llibc7 llibf7rc oldnames;


Additional query words: fail
Keywords : FORTLngIss kb16bitonly
Version : MS-DOS:4.0,4.01,4.1,5.0,5.1,1.0,1.00a; OS/2:4.1,5.0,5.1
Issue type : kbhowto


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: August 26, 1997
© 1998 Microsoft Corporation. All rights reserved. Terms of Use.