2011-08-22 13 views
5

Załóżmy, że mam podprogram, który akceptuje dwie tablice jako dane wejściowe. Jedna jest podana intencja (in), a druga intencja (na zewnątrz). Ten ostatni pochodzi z tego pierwszego w sposób arbitralny. Co jednak jeśli przejdę przez ten sam faktyczny argument dla obu argumentów? Zasadniczo wynik nie będzie zgodny z zamierzeniem podprogramu. Zobacz fragment kodu poniżej.Fortran: przekazanie tej samej tablicy, co dwa atrapy do podprogramu

Problem polega na tym, że kompilator nie wydaje się być tym zainteresowany, mimo że podałem flagę zamiaru. Używam Intel Visual Fortran Composer 12, z całą diagnostyką. Czy istnieje lepszy sposób kodowania podprogramu lub jakiejś opcji kompilatora, której brakuje, aby kod był bezpieczniejszy?

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 

Odpowiedz

7

Nazywa się to wygładzaniem - odnosząc się do tej samej pozycji za pomocą dwóch różnych nazw. W większości przypadków nie jest to dozwolone w Fortranie. Twój przykład nie jest legalny Fortran - patrz http://software.intel.com/en-us/blogs/2009/07/10/doctor-fortran-in-ive-come-here-for-an-argument-side-2/, który ma ten szczególny przypadek, aliasing za pomocą tego samego faktycznego argumentu używanego dla dwóch fałszywych argumentów. Kompilatory Fortran nie są wymagane do diagnozowania wszystkich naruszeń reguł języka i wydaje się, że jest to przykład, którego kompilator nie rozpoznaje.

Edycja: aliasing jest dozwolony. Zakazana jest zmiana wartości atrapa poprzez alias, tutaj drugi atrapa. Reguły są mniej restrykcyjne dla argumentów wskaźnika i celu. Szczegółowe zasady są opisane w "The Fortran 2003 Handbook" autorstwa Adams i in.

+0

Dzięki, że podaje ją do góry. To niefortunne, że Intel Visual Fortran nie ostrzega o tym. Sądzę, że jedynym rozwiązaniem jest dyscyplina w stosowaniu odpowiednich wywołań podprogramów. – bdforbes

+0

Co sądzisz o porównaniu lokalizacji dwóch wprowadzonych tablic? Czy to jest bezpieczne? Ponadto, najwyraźniej F2003 nie realizuje funkcji loc, czy istnieje odpowiednik? – bdforbes

1

Umieszczenie nawiasów wokół argumentu, że ma zamiar (w) sprawia, że ​​kodeks prawny, ponieważ jesteś skutecznie przekazując kopię:

call sub_b((array),array) 
Powiązane problemy