従来の Fortran コード (+100,000 行のコード) のメモリ割り当てを C++ で引き継ごうとしています。これは、クラスタ上の分散メモリの分割と割り当てに C ライブラリを使用しているためです。割り当て可能な変数は、モジュールで定義されます。これらのモジュールを使用するサブルーチンを呼び出すと、インデックスが間違っているように見えます (1 つシフトされます)。ただし、同じ引数を別のサブルーチンに渡すと、期待どおりの結果が得られます。次の簡単な例は、この問題を示しています。
こんにちは.f95:
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
main.cpp
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<10; ++i) __mymod_MOD_a[i] = i;
hello_();
return 0;
}
以下でコンパイルしています:
gfortran -c hello.f95; c++ -c main.cpp; c++ main.o hello.o -o main -lgfortran;
実行中の出力 ./main は
A(1): 1
A(2): 2
A(1): 0
A(2): 1
ご覧のとおり、A の出力は異なりますが、両方のサブルーチンが A(1) と A(2) を出力しました。したがって、HELLO は A(1) ではなく A(0) から始まるようです。これはおそらく、Fortran で ALLOCATE が直接呼び出されていないため、A の境界を認識していないためです。回避策はありますか?