2012-01-17 7 views
20

ポインタの配列を実装しようとしているので、要素をループすることができます。しかし、私はこれを正しく行う方法がわからないです。その後、ポインタの配列

TYPE(domain),POINTER    :: d01,d02,d03 
TYPE(domain),DIMENSION(:),POINTER :: dom 
... 

dom(1) => d01 
dom(2) => d02 
dom(3) => d03 
... 

と:

... 
IF(ASSOCIATED(dom(2),d02))THEN 
... 

コンパイラ(pgf90 10.6から0、64ビットのターゲットのx86-64上のLinux -tpイスタンブール-64)

PGF90-S-0074-Illegal number or type of arguments to associated - keyword argument pointer (test_ptr.f90: 10) 
    0 inform, 0 warnings, 1 severes, 0 fatal for MAIN 

私の知る限り、どのようにポインタの配列をサブセット化するかについては何か問題があります。 dom(2)d02はともに、ランク0(スカラーポインタ)です。これを実装する正しい方法は何ですか?

ありがとうございました。

答えて

51

ええ、ポインタ配列はFortranでは面白いです。

TYPE(domain),DIMENSION(:),POINTER :: dom 

あなたは思うかもしれないとして、ポインタの配列を定義しますが、配列へのポインタはありません:

問題は、これがあることです。ストライドでも大規模な配列のスライスを指すFortranでこれらのことを行うことができるいくつかの素晴らしいことがありますが、それは間違いなく配列のポインタであり、ポインタの配列ではありません。私の知る限り、あなたはFortranでこれをしなければならない唯一の本当の理由は、構文が

type domainptr 
    type(domain), pointer :: p 
end type mytype 

type(domainptr), dimension(3) :: dom 

dom(1)%p => d01 
dom(2)%p => d02 
dom(3)%p => d03 

などである:

Fortranでポインタの配列を取得する唯一の方法は、型を定義することです。私は標準のいくつかのそれ以降のバージョンでこれが固定されて見てみたいと思います。

+1

ありがとうジョナサン、これは素晴らしい答えです。 – milancurcic