1

C関数を繰り返し呼び出すFortran90プログラムがあります。最初に関数を使用するとすべてうまくいきますが、2回目にコードが関数にアクセスしようとすると、次のエラーが発生します。

プログラム受信信号SIGSEGV:セグメンテーション違反-無効なメモリ参照。

Windowsでgfortranv.4.6を使用しており、ソースコードがないライブラリにリンクしています。ライブラリはDLLとして私に届き、gendefとdlltoolを使用して、リンクする.aライブラリを作成しました。

コードは次のようになります。

PROGRAM cmod
  USE, INTRINSIC :: ISO_C_BINDING
  INTERFACE
    LOGICAL (C_BOOL) FUNCTION clover(scen,reg,soil,top,rain,depth,numd,nums,numb, numd,addn,srate,stype,nloss,ploss,ErrStr) BIND (C, name = "ClOvr")

    USE, INTRINSIC :: ISO_C_BINDING
    INTEGER (C_INT), INTENT(IN), VALUE :: scen,reg,soil,topo,depth

    REAL (C_DOUBLE), INTENT(IN), VALUE :: rain,numd,nums,numb,numd

    REAL (C_DOUBLE), INTENT(IN), VALUE :: addn,srate
    INTEGER (C_INT), INTENT(IN), VALUE :: stype
    REAL (C_DOUBLE), INTENT(OUT) :: nloss,ploss
    CHARACTER(C_CHAR), INTENT(OUT) :: ErrStr(*)
    END FUNCTION clover
  END INTERFACE
  .....

  do
  .....
    result = clover(a,b,c, d, e, f, g, h, sb, sd, an, sr, st,lossx,lossy,err)
  ......
    result = clover(a,b,c, d, e, f, g, h, sb, sd, an, sr, st,lossx,lossy,err)
  end do
END PROGRAM cmod

私はCコードを持っていませんが、IBMFortranから移植しています。

インターフェイス宣言には、これらの2行が含まれています

!DEC$ ATTRIBUTES  VALUE :: scen,reg,soil,top,rain,depth,numd,nums,numb,numd,addn,srate,stype

!DEC$ ATTRIBUTES  REFERENCE :: lossx,lossy,ErrStr

IBM fortranは、次のコードを使用してライブラリーをロードし、関数にアクセスします。

pointer (q,clover)
p = loadlibrary("clover.dll")
q = getprocaddress(p, "ClOvr")

したがって、GNUFortranへの翻訳に何かが欠けている可能性があります

4

1 に答える 1

0

問題が見つかりました。コンパイルするときは、-mrtd (sdtcall)

于 2012-06-22T04:33:56.310 に答える