Пусть все процедуры находятся внутри модулей.
Если я передам массив real*8 aa(5,3)
в подпрограмму
subroutine sub(bb)
real*8, intent(in) :: bb(2,5)
...
end subroutine
с оператором call sub(aa)
будет скомпилирован без предупреждения, и первые 2 столбца из aa
заполнят массив bb
. Элементы массивов aa
и bb
расположены совершенно по-разному.
Если вместо этого написана процедура
subroutine sub(bb)
real*8, intent(in) :: bb(:,:)
...
end subroutine
тогда bb
будет иметь ту же форму и порядок хранения, что и aa
.
Q: Первое поведение весьма опасно, если забыть, что в подпрограмме есть объявления явного размера. Можно ли заставить компилятор предупреждать, когда массивы с явной формой изменяют форму / выравнивание?