Почему Fortran будет преобразовывать скалярное выражение в массив в выражении , но не в качестве аргумента процедуры? В частности, почему орган по стандартизации принял это проектное решение? Только из-за двусмысленности, процедура должна быть перегружена? Может ли сообщение об ошибке в этой ситуации быть альтернативным подходом?
Например, в приведенном ниже коде последний оператор x = foo(7)
выдает ошибку GFortran: Error: Rank mismatch in argument 'a' at (1) (1 and 0)
.
module m
public :: foo
contains
function foo(a) result(b)
integer, dimension(:) :: a
integer, dimension(size(a)) :: b
b = a+1
end function foo
end module m
program p
use m
integer, dimension(4) :: x
integer, parameter, dimension(4) :: y = (/1,2,3,4/)
x = 7
x = foo(x)
x = foo(y)
x = foo(x + 7)
x = foo(7)
end program p
Этот вопрос должен был задать вопрос о том, почему присвоение массива будет продвигать источник скалярного значения к цели массива; в отличие от функции массива. Я ожидаю, что это просто удобный особый случай. Любые комментарии с благодарностью получены в шапках для подаяний ниже.