PROGRAM main_fortran USE, INTRINSIC :: iso_c_binding , ONLY : c_int , c_float INTEGER( c_int ) :: i REAL( c_float ) :: r COMMON /com/ i , r INTERFACE SUBROUTINE init_name END SUBROUTINE init_name SUBROUTINE mc ( ) BIND(C,NAME=’mc ’ ) END SUBROUTINE END INTERFACE CALL init_name ! load COMMON block in Fortran CALL mc ! Call C code that gets pointer to COMMON WRITE(*,’(a,i4,f6.2)’ ) ’ fortran has the block /com/ : ’ , i , r END PROGRAM main_fortran SUBROUTINE init_name_c ( comp) BIND(C,NAME=’init_name_c ’ ) USE, INTRINSIC :: iso_c_binding , & ONLY : c_ptr , c_int , c_float , c_loc ! The C function mc calls init_name_c ( ) to get the ! location of the COMMON block start. TYPE( c_ptr ) :: comp INTEGER( c_int ) , TARGET :: i REAL( c_float ) :: r COMMON /com/ i , r ! Return a pointer to the first location of the COMMON block. comp = c_loc ( i ) WRITE(*,’(a,i4,f6.2)’ ) ’ fortran has common block /com/ : ’ , i , r END SUBROUTINE init_name_c SUBROUTINE init_name ! This is the original Fortran function ! assigning values to the COMMON BLOCK INTEGER :: i REAL :: r COMMON /com/ i , r i = 786 r = 3.2 END SUBROUTINE init_name