2012-02-21 12 views
2

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

私はのifortではなくのgfortranコンパイルと動的配列を受け入れているようだc_loc()機能に問題を持っているがエラーで停止します

Error: Argument 'septr1' to 'c_loc' at (1) must be an associated scalar POINTER

だから、誰でものgfortranでコンパイルするために、次のifortコードを適応させる方法を知ってい?

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

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

答えて

2

あなたは、配列の先頭の位置を得ることができる、との値は、C

septr = c_loc(septr1(1)) 

又は一般的ではないが、1 LBOUND(septr1)に0をオフセット。

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

---編集---

私はポインタのための要件は、Fortran 2008のドラフトでのスカラーであることを表示されていないが、それは、Fortran 2003年に本を説明しています。 Fortran 2008で変更された可能性があります。私のgfortran 4.7にはスカラーポインタが必要です。

--- --- EDIT2

通常のFortranのように参照によって配列を渡すと、明示的なCポインタを構築していない一般的にはるかに優れています。たとえば、次のsome_c_functionは、Cプロトタイプのため

void some_c_function(int n, float* A) //(hope so, I am not so good in C). 
+0

tnx、この音は簡単です。この方法では、配列はcプログラムから正しくアクセスできますか?私はウェブ上のどこかでfortranがcと同じ方法で配列のメモリを扱っていないと読んでいます – kodmasin

+0

アクセス可能ですが、インデックスの順序は逆になります。 http://en.wikipedia.org/wiki/Row-major_order不連続な配列に問題がある可能性があります。しかし、実際には、通常のFortranの方法で配列を参照渡しし、明示的なCポインタを使用しない方がはるかに優れています。答えの編集2を参照してください。 –

+0

@VladimirFでは、Cポインタを使用する代わりに、Fortran配列を参照渡しするほうがずっと優れていますか?型の安全性と明快さのほんの一部ですか? – patrickvacek

0

のifort開発者はレガシーよりそのより制限された使用方法を含めC_LOCの標準への準拠のチェックを、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 

を言った

call some_c_function(n,A) 

LOC()は、Fortran標準の規定では必要ありません。 おそらく、現在の標準でこの組み込み関数を有効に適用するためのより広い範囲と、テストする必要がある使用範囲を制限する必要性を考えると、ほとんどのコンパイラは非標準の使用法を拒否します。