以前の投稿をよく見ましたが、このトピックがカバーされているとは思いません。誰かが助けてくれることを願っています. 私は fortran 2003 でコードを書き、ifort を使用しています。操作する必要がある次の型があり、必要な柔軟性を与えるように設計しています。
module parameters
double precision, target :: cur_x(3)
type fundamental
double precision, pointer :: x => null()
end type fundamental
type, extends(fundamental) :: ion
class(fundamental), pointer :: core => null()
end type ion
SAVE
end module parameters
リストの前のものを次のコアとして使用することにより、粒子のリンクされたリストのようなものを構築するという考えです。実際には、「ファンダメンタル」への多数の拡張があり、そのすべてが他の粒子の「コア」になる可能性があることに注意してください。かなり複雑な方法でそれらのサブセットをアドレス指定するため、計算された量 x を物理メモリ内の配列に一緒に配置したいので、cur_x への別のポインターのセットを使用したい
コードの初期化は次のようになり、診断行をいくつか追加しました。
use parameters
type(fundamental), target :: electron, proton
type(ion), target :: hydrogen
write(*,*)associated(electron%x),associated(proton%x), &
& associated(hydrogen%core),associated(hydrogen%core%x)
electron%x => cur_x(1)
hydrogen%core => proton
proton%x => cur_x(2)
hydrogen%x => cur_x(3)
cur_x = 1.0
write(*,*)electron%x,proton%x,hydrogen%x,hydrogen%core%x
印刷する
F F F T
1.0 1.0 1.0 <garbage>
proton%x と Hydrogen%core%x がメモリ内の同じアドレス (cur_x(2)) であると予想される場合。だから私は2つの質問があります
すべてのポインターを null に初期化しました。associated(hydrogen%core%x) が真になるのはなぜですか? コードの先頭でこのポインターを無効にしようとすると、一貫性のない結果が得られます。使用して
nullify(hydrogen%core%x)
セグメンテーション違反が発生します。実行中
hydrogen%core%x => null()
コードの実行を許可しますが、associated(hydrogen%core%x) は true のままです
- fortran の驚くべきエラーのこの要約で示唆されているように、親から子へのポインターのリストを関連付けることを確認しました。proton%x は機能しているが、hydrogen%core%x がガベージを与えるという事実は、私には理解できないものです。
この問題を回避することはできますが、より複雑な計算に必要な一般性が犠牲になります。また、ここで何が問題なのかを理解したいと思います。
ご協力いただきありがとうございます!ジム
編集:さまざまなものの「ターゲット」プロパティに追加されました。これは常にコードに含まれていることに注意してください。この投稿に転送するときにそれらを忘れてしまいました
編集:明確にするために、上記のコードに関する私の主な問題は、最初の書き込み後に関連付けコマンドを実行しても、最後の書き込みコマンドが Hydrogen%core%x の初期化されていない出力を与えることです。型定義でコアを null として初期化しても、問題があるようです。コードの先頭でそれを無効にしようとすると、プログラムがクラッシュします。