2

私は Fortran の初心者で、gfortran でコンパイルするためにいくつかの ifort コードを採用しようとしています。

関数に問題がありc_loc()ます.ifortでは動的配列を受け入れるようですが、gfortranではコンパイルがエラーで停止します:

エラー: (1) の 'c_loc' への引数 'septr1' は、関連付けられたスカラー POINTER でなければなりません

次の ifort コードを gfortran でコンパイルする方法を知っている人はいますか?

integer(c_int), dimension(:), pointer  :: septr1=>null()
type(c_PTR) :: septr

allocate (septr1(10))
septr1 = 33
septr = c_loc(septr1)
4

2 に答える 2

2

これは、古い Fortran 2003 からの要件のようで、Fortran 2008 で緩和されました。最近の gfortran (5+) はこれを受け入れます。


配列の開始位置、C のオフセット 0 の値を取得できます。

septr = c_loc(septr1(1))

または通常は 1 ではなく lbound(septr1) です。

Metcalf、Reid、および Cohen または Fortran 標準の c_loc 引数の要件を参照してください。


一般に、通常の Fortran の方法で参照によって配列を渡し、明示的な c ポインターを作成しない方がはるかに優れています。例えば:

 call some_c_function(n,A)

some_c_function には Fortran インターフェイスがあります

 interface
  subroutine some_c_function(n,A) bind(C)
   use iso_c_binding,only: c_int,c_float    !you can use also import here

   integer(c_int),value      :: n
   real(c_float),dimension(n):: A
  end subroutine some_c_function
 end interface

C プロトタイプ用

 void some_c_function(int n, float* A)  //(hope so, I am not so good in C).
于 2012-02-21T09:06:52.610 に答える
0

ifort の開発者は、従来の LOC() よりも使用が制限されていることを含め、c_loc の標準準拠チェックは、Fortran 標準の規定によって要求されていないと述べています。おそらく、現在の標準におけるこの組み込み関数の有用なアプリケーションのより広い範囲と、テストする必要がある使用の範囲を制限する必要性を考慮して、ほとんどのコンパイラは非標準の使用を拒否します。

于 2013-05-17T15:35:41.433 に答える