2011-01-18 16 views
12

Perché lo standard Fortran 90 Specification specifica (5.2.8) che la parola chiave TARGET deve essere utilizzata per associare un POINTER ad esso? Perché non tutti i tipi sono un TARGET valido?Perché un POINTER Fortran richiede un TARGET?

Per esempio,

 
INTEGER, POINTER :: px 
INTEGER, TARGET :: x 
x = 5 
px => x 
è sintassi valida ma
 
INTEGER, POINTER :: px 
INTEGER :: x 
x = 5 
px => x 
è non valida.

Perché deve essere?

risposta

15

Un elemento che potrebbe essere indirizzato potrebbe essere sottoposto a un alias di un altro elemento e il compilatore deve consentirlo. Gli articoli senza l'attributo target non dovrebbero essere alias e il compilatore può fare ipotesi basate su questo e quindi produrre un codice più efficiente.

+0

Il mio commento precedente non è stato preciso. L'associazione puntatore/bersaglio può portare a situazioni davvero difficili. Vi raccomando qualche ulteriore lettura se siete inesperti con le pratiche di associazione puntatore/target in Fortran. Vedere, ad esempio, questo collegamento https://software.intel.com/en-us/forums/intel-fortran-compiler-for-linux-and-mac-os-x/topic/709550 –

2

I puntatori in fortran sono diversi dai puntatori in c. In Fortran sono stati forniti 90 puntatori con poche restrizioni come avere un bersaglio. Questo è stato fatto per risolvere il problema di velocità e per mantenere sicuro l'utilizzo del puntatore. Sebbene una chiamata faccia puntatori allocabili che non hanno bisogno di specificare un obiettivo. Scava più a fondo e li troverai !!

0

Per una migliore ottimizzazione del compilatore. Quando il tuo codice funziona su 1K-100K, la velocità dei core è importante.

Btw TARGET non è sempre utilizzato. Ad esempio in situazioni in cui il puntatore viene utilizzato per allocare memoria.

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

A seconda del compilatore, devi allocare (x (5)) affinché funzioni. – AlanSE

+0

@AlanSe Quale compilatore per favore? L'insieme di linee mostrato sembra giusto. –

+2

@ user49734 TARGET non è necessario qui (e nemmeno vietato) perché un puntatore è sempre "targable" –

Problemi correlati