2012-01-17 15 views
20

Sto tentando di implementare una serie di puntatori, in modo da poter eseguire il loop sugli elementi. Tuttavia non sono sicuro come fare questo in modo corretto:Matrici di puntatori

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

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

e poi:

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

Il compilatore (pgf90 10,6-0 64 bit bersaglio su x86-64 Linux -tp istanbul-64) mi dà questo messaggio di errore:

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 

Per quanto ho capito, c'è qualcosa di sbagliato su come ho sottoinsieme una serie di puntatori. Entrambi dom(2) e d02 sono di livello 0 (puntatori scalari). Qual è il modo corretto di implementarlo?

Grazie.

risposta

51

Sì, gli array di puntatori sono divertenti in Fortran.

Il problema è che questo:

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

non definisce un array di puntatori, come si potrebbe pensare, ma un puntatore ad un array. C'è un certo numero di cose interessanti che puoi fare con Fortran - puntando a sezioni di grandi matrici, anche con passi da gigante - ma è sicuramente un puntatore a un array, non a una serie di puntatori.

L'unico modo per ottenere un array di puntatori a Fortran è quello di definire un tipo:

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 

ecc Per quanto posso dire, l'unica vera ragione che devi fare questo in Fortran è la sintassi. Mi piacerebbe vederlo risolto in una versione successiva dello standard.

+1

Grazie Jonathan, questa è un'ottima risposta. – milancurcic

Problemi correlati