2011-01-18 13 views
12

¿Por qué el Fortran 90 Specification especifica (5.2.8) que la palabra clave TARGET se debe usar para asociar un POINTER a él? ¿Por qué no todos los tipos son un OBJETIVO válido?¿Por qué un Fortran POINTER requiere un OBJETIVO?

Por ejemplo,

 
INTEGER, POINTER :: px 
INTEGER, TARGET :: x 
x = 5 
px => x 
es sintaxis válida, pero
 
INTEGER, POINTER :: px 
INTEGER :: x 
x = 5 
px => x 
es no válida.

¿Por qué debe ser esto?

Respuesta

15

Un elemento que podría señalarse podría ser un alias a otro elemento, y el compilador debe permitir esto. Los elementos sin el atributo de destino no deben tener alias y el compilador puede hacer suposiciones basadas en esto y, por lo tanto, producir un código más eficiente.

+0

Mi comentario anterior no era exacto. La asociación puntero/objetivo puede conducir a situaciones realmente complicadas. Recomiendo leer más si no tienes experiencia con las prácticas de asociación puntero/objetivo en Fortran. Consulte, por ejemplo, este enlace https://software.intel.com/en-us/forums/intel-fortran-compiler-for-linux-and-mac-os-x/topic/709550 –

2

Los punteros en fortran son diferentes a los punteros en c. En Fortran 90 punteros fueron provistos con pocas restricciones como tener un objetivo. Esto se hizo para abordar el problema de la velocidad y mantener el uso del puntero a salvo. Aunque una llamada hace punteros asignables que no necesitan especificar un objetivo. ¡Profundiza y los encontrarás!

0

Para una mejor optimización del compilador. Cuando su código se ejecuta en núcleos de 1K a 100K, la velocidad sí importa.

Btw TARGET no siempre se utiliza. Por ejemplo, en situaciones en las que el puntero se usa para asignar memoria.

... 
real, pointer :: p(:), x 
... 
allocate(p(15)) 
... 
x => p(1:5) 
... 
nullify(x) 
deallocate(p) 
... 
+0

Dependiendo del compilador, tienes que asignar (x (5)) para que esto funcione. – AlanSE

+0

@AlanSe ¿Qué compilador por favor? El conjunto de líneas mostrado parece correcto. –

+2

@ user49734 TARGET no es necesario aquí (e incluso prohibido) porque un puntero siempre es "targettable" –

Cuestiones relacionadas