連続したメモリブロックにない配列内の要素をリセットしたいと考えています。私は、ポインタ配列の私の理解として、彼らはメモリのコヒーレントブロックを指し示す必要があるので、ポインタ配列の代わりにポインタの配列を使用すると思った(例えばポインタ(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
に関連していると思いますが、私はここでその答えを使用する方法を見ることができません。おそらく
ありがとうございましたマーク:)実際には、私は戻って、データ配列をインデックスするためにインデックス配列を使って、まさにそれを行うソリューションをコーディングしました。私がリンクしている他のstackoverflowの質問に指摘されているように(指摘されていない)指摘されているように、私は順番に各座標を選ぶ必要があるようです(インデックス1,2,3を手動で使用します):imark(memf3d(1: memf3d(1:memf3dp、2)、memf3d(1:memf3dp、3))= 1ポインタがより柔軟な解決法を提供するかもしれないと思ったので、私はこのようにハードコーディングが嫌いですが、あなたの言うことからは不可能かもしれません。ありがとう! –
あなたのコメントは、あなたが* X/Y質問*として知られていることを尋ねているかどうか疑問に思います - 例えばhttps://meta.stackoverflow.com/questions/333921/how-should-impossible-questions-処理される/ 333922#333922。私はあなたの質問がすべきではないのだろうかと疑問に思う。*非連続配列セクションに代入を行う(または操作する)方法は?*。それがあなたの本当の質問なら、それに尋ねてください。 –
私はそれがX/Yの質問であるかどうかは分かりませんが、通常の配列の場合と同じように同じ表記法idx(:)%pを使用できない理由は分かりません。しかし、最終的には、arr([2,4]、[3,2])が4を設定して以来、上記の私の編集での解決策は意図した通りにできなかったので、ループでポインタを使用することに戻りました。要素は2ではないので、直接インデックスを使用しても座標ベクトルをループする必要がありました。したがって、ループが必要な場合は、do i = 1、n idx(i)%p = 5 end doはそれほど役に立ちません。それは長い言い方です、私の質問は本当にどのようにポインタを(ループなし)を使用してarr –