title: Allocating memory in C for a Fortran allocatable
body: <p>We are trying to take over the memory allocation of a legacy Fortran code (+100,000 lines of code) in C++, because we are using a C library for partitioning and allocating distributed memory on a cluster. The allocatable variables are defined in modules. When we call subroutines that use these modules the index seems to be wrong (shifted by one). However, if we pass the same argument to another subroutine we get what we expect. The following simple example illustrates the issue:</p>
  
  <p>hello.f95:</p>
  
  <pre><code> MODULE MYMOD
      IMPLICIT NONE
      INTEGER, ALLOCATABLE, DIMENSION(:) :: A
      SAVE
    END MODULE
  
    SUBROUTINE TEST(A)
      IMPLICIT NONE
      INTEGER A(*)
      PRINT *,"A(1): ",A(1)
      PRINT *,"A(2): ",A(2)
    END
  
    SUBROUTINE HELLO()
      USE MYMOD
      IMPLICIT NONE
      PRINT *,"A(1): ",A(1)
      PRINT *,"A(2): ",A(2)
      CALL TEST(A)
    end SUBROUTINE HELLO
  </code></pre>
  
  <p>main.cpp</p>
  
  <pre><code>extern "C" int* __mymod_MOD_a; // Name depends on compiler
  extern "C" void hello_();      // Name depends on compiler
  
  int main(int args, char** argv)
  {
    __mymod_MOD_a = new int[10];
    for(int i=0; i&lt;10; ++i) __mymod_MOD_a[i] = i;
    hello_();
    return 0;
  }
  </code></pre>
  
  <p>We are compiling with:</p>
  
  <pre><code>gfortran -c hello.f95; c++ -c main.cpp; c++ main.o hello.o -o main -lgfortran;
  </code></pre>
  
  <p>Output from running ./main is</p>
  
  <pre><code> A(1):            1
   A(2):            2
   A(1):            0
   A(2):            1
  </code></pre>
  
  <p>As you can see the output of A is different, though both subroutines printed A(1) and A(2). Thus, it seems that HELLO starts from A(0) and not A(1). This is probably due to that ALLOCATE has never been called directly in Fortran so that it is not aware of the bounds of A. Any work arounds?</p>