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
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
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