Fortran と C の間で文字列を渡す際に問題があります。
Fortran サブルーチン呼び出しは次のようになります。
CALL MMEINITWRAPPER(TRIM(ADJUSTL(PRMTOP)), 0, SALTCON, RGBMAX, CUT)
これで動作する C には次の署名があります。
int mmeinitwrapper_(char *name,
int *igb,
REAL_T *saltcon,
REAL_T *rgbmax1,
REAL_T *cutoff1)
いくつかの印刷ステートメントをさまざまな場所に配置すると、ifort でコンパイルするまで、すべてが正常に機能します。その場合、出力は次のようになります。
Topology file name:
coords.prmtop
coords.prmtop
Topology file name length: 81 13
length in C: 8
read argument: coords.prmtop��*
Reading parm file (coords.prmtop��*)
coords.prmtop��*, coords.prmtop��*.Z: does not exist
Cannot read parm file coords.prmtop��*
Portland コンパイラを使用すると、次のようになります。
Topology file name:
coords.prmtop
coords.prmtop
Topology file name length: 81 13
length in C: 8
read argument: coords.prmtop
Reading parm file (coords.prmtop)
最初のセットの長さは、トリミングされていない/調整されていない文字列の Fortran からのもので、次にトリミング/調整された文字列です。C の長さは からsizeof(name)/sizeof(name[0])
です。
長すぎるメモリのセクションを渡しているようで、その後の実行では、さまざまな長さの悪いものが書き込まれます (ただし、C で報告される長さは常に 8 です)。
誰にもアイデアはありますか?Fortran/C の組み合わせで gdb をうまく動作させるのは困難です。