2016-07-20 3 views
0

3D配列ポインタを4D配列ポインタに格納したいが、何か問題がある。例えば:functionp(:,:,:)などのポインタを返す関数へのポインタであり、これは正常に動作Fortranでのポインタ配列操作 - 下限エラー

real,pointer :: p(:,:,:,:) => null() 
integer :: ndims,d 

ndims = 3 
do d=1,ndims 
    p(d,:,:,:) => function 
end do 

。私が得ているエラーは、この行のLower bound has to be presentです:p(d,:,:,:) => functionしかし、私はこの種の操作を(ポインタではなく)実行していて、それは問題なく動作しました。私はここで何が欠けていますか?

+0

現在、1つのランク4 pウインター任意の時点で、単一のターゲット配列に1つのランクの4つのポインタをポイントすることができます。おそらくhttp://stackoverflow.com/a/8901228/1234550が役立つかもしれません。 – IanH

+0

はい、私は別のランク3の配列を指し、これをランク4のポインタに格納したいと考えています。これは実際に可能ですか? –

答えて

3

私は、これは実際にはFortranでやっていること

real,pointer :: p(:,:,:,:) => null() 

の一般的な誤解から来ていると思います。

ポインタの4D配列ではなく、4D配列へのポインタ 'p'です。あなたは何ができるか

は、ちょっとしたトリックを再生し、内部のポインタで構造体を作成することです:

type pointer4D 
    real, pointer :: p 
end type pointer4D 
type(pointer4D), dimension(:) :: arr 

あなたのコードは、このようになる:「関数」を仮定し

do d=1,ndims 
    arr(d)%p => function 
end do 

は、ある種のです3Dオブジェクトを使用すると、次元Nの要素I、j、kにアクセスできます。

arr(N)%p(I,j,k) 
+0

これは意味があります。 Yeap、私は基本的に 'p'の定義で混乱しました。これはC++の場合とは異なりますか? –

+0

@bfgはい。 C++では、誤解がなければ、ポインタの配列をp [ndim]として定義することができます。これはFortranでは不可能です。 – Scarlehoff