2017-08-04 13 views
0

連続したメモリブロックにない配列内の要素をリセットしたいと考えています。私は、ポインタ配列の私の理解として、彼らはメモリのコヒーレントブロックを指し示す必要があるので、ポインタ配列の代わりにポインタの配列を使用すると思った(例えばポインタ(1:10,1:10)=>ターゲット(1 :次のようにポインタの配列を使用してFORTRANで隣接しない配列エントリを割り当てる方法

私の簡単なテストプログラムである100)):

program test 
    implicit none 

    integer, target :: arr(4,4) 

    type ptr 
    integer, pointer :: p 
    end type ptr 

    type(ptr), dimension(2) :: idx 

    arr=0 

    idx(1)%p=>arr(2,2) 
    idx(2)%p=>arr(4,2) 

    idx(1)%p=5 ! this is okay 
    idx(2)%p=5 ! this is okay 
    idx(1:2)%p=5 ! this gives an error 

    print *,arr 

end program test 

最初の二つの文IDX(N)の%p = 5は大丈夫ですが、私はのチャンクを設定できるようにしたいです(1:n)%p = 5のスパンニングメソッドを使用して1つのステートメントに配列を作成しますが、これを行うと次のコンパイルエラーが発生します:

Error: Component to the right of a part reference with nonzero rank must not have the POINTER attribute at (1) 

何らかの方法でポインタを使用して配列エントリのチャンクの値を設定できますか?おそらくそれは、ポインタ配列ではなくポインタの配列で、実際に可能です...

私は、これはFortran: using a vector to index a multidimensional array

に関連していると思いますが、私はここでその答えを使用する方法を見ることができません。おそらく

答えて

0

拡張コメントではなく、その答えが、私は少し書式設定を必要とする...

それはポインタのFortranのサポート配列を考えていないのが最善です。あなたはすでにそれを把握しており、ポインターである要素を持つ型の各インスタンスの派生型の配列の通常の回避策を構築しました。あなたは、このような

arr([2,4],[2]) = 5 

(OK、第二の添え字は、縮退ベクトルのようなものですが、文が同じ効果を有することが意図されるなど、複数のベクトル添字を使用しない理由は完全には明らかではない何

ですポインタを使用するようにしよう。)あなたは、むしろ、あなたが

に代わり
arr(2:4:2,2) = 5 

を配列の添字三つ組を使用することができます場合はおそらく、あなたは私の微弱な提案はしません場合は、ポインタを使用しての必要性を表現するために、あまりにも遠く、あなたのニーズを簡素化しましたあなたの宣告されていないニーズ。

+0

ありがとうございましたマーク:)実際には、私は戻って、データ配列をインデックスするためにインデックス配列を使って、まさにそれを行うソリューションをコーディングしました。私がリンクしている他のstackoverflowの質問に指摘されているように(指摘されていない)指摘されているように、私は順番に各座標を選ぶ必要があるようです(インデックス1,2,3を手動で使用します):imark(memf3d(1: memf3d(1:memf3dp、2)、memf3d(1:memf3dp、3))= 1ポインタがより柔軟な解決法を提供するかもしれないと思ったので、私はこのようにハードコーディングが嫌いですが、あなたの言うことからは不可能かもしれません。ありがとう! –

+0

あなたのコメントは、あなたが* X/Y質問*として知られていることを尋ねているかどうか疑問に思います - 例えばhttps://meta.stackoverflow.com/questions/333921/how-should-impossible-questions-処理される/ 333922#333922。私はあなたの質問がすべきではないのだろうかと疑問に思う。*非連続配列セクションに代入を行う(または操作する)方法は?*。それがあなたの本当の質問なら、それに尋ねてください。 –

+0

私はそれがX/Yの質問であるかどうかは分かりませんが、通常の配列の場合と同じように同じ表記法idx(:)%pを使用できない理由は分かりません。しかし、最終的には、arr([2,4]、[3,2])が4を設定して以来、上記の私の編集での解決策は意図した通りにできなかったので、ループでポインタを使用することに戻りました。要素は2ではないので、直接インデックスを使用しても座標ベクトルをループする必要がありました。したがって、ループが必要な場合は、do i = 1、n idx(i)%p = 5 end doはそれほど役に立ちません。それは長い言い方です、私の質問は本当にどのようにポインタを(ループなし)を使用してarr –

関連する問題