2011-08-22 12 views
5

Supponiamo di avere una subroutine che accetta due matrici come input. Uno è dato intento (in) e l'altro è dato intento (fuori). Quest'ultimo è derivato dal primo in modo arbitrario. Tuttavia, cosa succede se passo lo stesso argomento effettivo per entrambi gli argomenti fittizi? In generale, il risultato non sarà ciò che è stato inteso dalla subroutine. Vedi lo snippet di codice qui sotto.Fortran: passa lo stesso array di due argomenti fittizi alla subroutine

Il problema è che il compilatore sembra non curarsene, anche se ho dato delle flag di intent. Sto usando Intel Visual Fortran Composer 12, con tutti i dati diagnostici. C'è un modo migliore di codificare la subroutine, o qualche opzione del compilatore che mi manca, per rendere il codice più sicuro?

module foo 

    contains 

    subroutine sub_a() 
     implicit none 
     real::array(10,10) 

     call sub_b(array,array) 

    end subroutine 

    subroutine sub_b(array1,array2) 
     implicit none 
     real,intent(in)::array1(10,10) 
     real,intent(out)::array2(10,10) 

     !array2 is derived from array1 somehow 

    end subroutine 

end module foo 

risposta

7

Questo è chiamato aliasing - si riferisce allo stesso elemento con due nomi diversi. Nella maggior parte dei casi ciò non è consentito in Fortran. Il tuo esempio non è Fortran legale - vedi http://software.intel.com/en-us/blogs/2009/07/10/doctor-fortran-in-ive-come-here-for-an-argument-side-2/, che ha questo caso specifico, di aliasing tramite lo stesso argomento effettivo utilizzato per due argomenti fittizi. I compilatori Fortran non sono richiesti per diagnosticare tutte le violazioni delle regole del linguaggio e questo sembra essere un esempio che il compilatore non sta riconoscendo.

Modifica: è consentito l'aliasing. Quello che è proibito è cambiare il valore dell'argomento dummy attraverso l'alias, qui l'altro argomento fittizio. Le regole sono meno restrittive per gli argomenti pointer e target. Le regole specifiche sono descritte in "Il manuale di Fortran 2003" di Adams et al.

+0

Grazie, che libera in su. È sfortunato che Intel Visual Fortran non avvisa per questo. Immagino che l'unica soluzione sia la disciplina nell'usare le chiamate di subroutine appropriate. – bdforbes

+0

Cosa ne pensi di confrontare la posizione dei due array immessi? È una cosa sicura da fare? Inoltre, apparentemente F2003 non implementa la funzione loc, esiste un equivalente? – bdforbes

1

Mettendo tra parentesi l'argomento che è intento (in) rende il codice legale dal momento che si sta effettivamente passando una copia:

call sub_b((array),array)