1

次の例では、組み込み関数transfer()は 'b' に対して適切に機能します。

ただし、ポリモーフィック オブジェクトでは機能しませんa(つまり、正しいサイズの char 配列を返すことができません)。

誰かがこの理由を説明できますか?

また、(MPI を使用するために) 任意の型のデータをシリアル化/パッケージ化する方法について、誰かがアイデアを提供できますか?

ありがとう。

module mm
  type::typeA
    integer dat(10)
  end type
end module

program test
  use mm
  class(typeA),allocatable::a
  type(typeA)::b
  allocate(a)
  write(*,*),size(transfer(a,['c']))
  write(*,*),size(transfer(b,['c']))
end program
4

1 に答える 1

5

ポリモーフィック オブジェクトには、クラス vtable や RTTI テーブルへのポインタなど、追加の隠しフィールドが含まれている可能性が高くなります。さらに、ポリモーフィック オブジェクトを割り当て可能にしたので、それが原因で追加の非表示フィールドが存在する可能性があります。

vtable アドレスが異なる MPI ランクで同じであるとは限らないため、これらのポインター値を転送しても役に立たない可能性があります。代わりに、ポリモーフィック型の場合、カスタムのシリアライズ/デシリアライズ ルーチンを作成する必要があります。ここでは、各データ フィールドをシリアライズして別の MPI ランクに転送し、受信側で空のオブジェクトを作成して、受信したデータを入力します。

于 2012-04-19T07:32:32.640 に答える