2012-01-17 9 views
20

Estoy tratando de implementar una matriz de punteros, para que pueda recorrer los elementos. Sin embargo no estoy seguro de cómo hacer esto correctamente:matrices de punteros

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

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

y luego:

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

El compilador (10,6-0 pgf90 de destino de 64 bits en Linux x86-64 -tp Estambul-64) me da este mensaje de error:

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 

Por lo que yo entiendo, hay algo malo acerca de cómo me subconjunto una matriz de punteros. Ambos dom(2) y d02 tienen el rango 0 (indicadores escalares). ¿Cuál es la forma correcta de implementar esto?

Gracias.

Respuesta

51

Sí, las matrices de punteros son divertidas en Fortran.

El problema es que esto:

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

no define una matriz de punteros, como se podría pensar, sino un puntero a una matriz. Hay una serie de cosas interesantes que puedes hacer con estas cosas en Fortran, apuntando a segmentos de matrices grandes, incluso con zancadas, pero definitivamente es un puntero a una matriz, no una matriz de punteros.

La única manera de conseguir arreglos de apuntadores en Fortran es definir 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 

etc. Por lo que yo puedo decir, la única razón real que tiene que hacer esto en Fortran es la sintaxis. Me encantaría ver esto arreglado en alguna versión posterior del estándar.

+1

Gracias Jonathan, esta es una gran respuesta. – milancurcic

Cuestiones relacionadas