2012-04-18 6 views
1

次の例では、組み込み関数transfer()が 'b'に対してうまく機能します。型とクラス間のデータ格納の相違

多形体aでは正しく動作しません(正しいサイズの文字配列を返すことはできません)。

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

誰もが任意のタイプ(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 

答えて

5

多相オブジェクトには、クラスvtableおよび/またはRTTIテーブルへのポインタなどの追加の隠しフィールドが含まれている可能性が最も高いです。さらに、ポリモーフィックオブジェクトを割り当てることができるようになっているので、そのために追加の隠しフィールドが存在する可能性があります。

vtableアドレスが異なるMPIランクで同じであることが保証されていないため、これらのポインタ値を転送することは有用ではありません。代わりに、多態型の場合は、各データフィールドをシリアル化し、別のMPIランクに転送し、受信側で空のオブジェクトを作成し、受け取ったデータで埋め込むカスタムのシリアル化/デシリアライズルーチンを作成する必要があります。

関連する問題