3

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 をうまく動作させるのは困難です。

4

2 に答える 2

5

あなたが探している答えはここにあると思います:

iso_c_binding を使用した fortran-C ブリッジの文字列の配列

基本的に、fortran は文字列の長さを「認識」していますが、C は認識していないため、fortran の長さを C に送信し、C コードで適切に反応することによって、C コードに何らかの方法で知らせる必要があります。

以下のこの質問では、「純粋な」fortran POV からこの問題を調査し、さまざまな回答からいくつかの洞察を得ることができます。

Fortran から C 、文字列に割り当てられたスペースに対するトリムの効果

また、コンパイラは、観察されたさまざまな動作を説明するために、未定義または実装固有の違いを利用する可能性があることに注意してください。

sizeofまた、文字列のサイズが得られると仮定して間違いを犯していることに気付きました。ポインターのサイズを指定します。それ自体が C の 8 バイトの定数であるsizeof(name)/sizeof(name[0])a のサイズを指定する定数も同様です。は char ポインターのサイズを指定し、char のサイズを指定します。結果は定数 8 です。charsizeof(name)sizeof(name[0])

于 2013-11-11T19:26:22.343 に答える