1

データをポインターとして返すサブルーチンを作成しようとしています。

私はそのようなものが欲しい:

subroutine f(p)
     type(tra), pointer p
     type(tra), target :: instance

     p=>instance
     do_work(instance)
end subroutine

厳密に言えば、C++ の "new" 演算子のアナログを実装したいと考えています。

次に、次のようなサブルーチンを使用したいと思います。

subroutine other
    type(tra), pointer :: p1,p2
    call f(p1)
    call f(p2)
end subroutine

f が終了した後に f 内の「インスタンス」が破棄され、次の f の呼び出しでメモリ内の同じ場所に「インスタンス」が再度作成されるため、上記のコードは機能しない可能性があります。

p1特に、同じオブジェクトをp2指していることがわかりましたが、これはコンパイラに依存していると思います。本当ですか?

可能な解決策は次のとおりだと思います。

subroutine f(p)
     type(tra), pointer p
     type(tra), allocatable, target :: instance(:)

     p=>instance(1)
     do_work(instance(1))
end subroutine

これは物事を行う「公式」の方法ですか?

4

1 に答える 1

1

厳密に言えば、C++ の "new" 演算子のアナログを実装したいと考えています。

ですALLOCATE。あなたがやろうとしていることは、単にこれであるべきです:

subroutine f(p)
     type(tra), pointer :: p

     ! you can actually leak memory this way! caution required.
     if(associated(p)) then
         stop "possible memory leak - p was associated"
     end
     allocate(p)
     do_work(p)
end subroutine

f が終了した後に f 内の「インスタンス」が破棄され、次の f の呼び出しでメモリ内の同じ場所に「インスタンス」が再度作成されるため、上記のコードは機能しない可能性があります。

いいえ、そうではありません。ローカル サブルーチン変数は、通常、一度だけ「割り当て」られます (さらには一度だけ初期化されます)。たとえば、Fortran 90 仕様の第 14 章、特にセクション 14.7 を参照してください。

于 2012-12-27T23:49:56.520 に答える