Почему Фортран преобразует скалярное выражение в массив в выражении, но не в качестве аргумента процедуры? В частности, почему орган по стандартизации принял такое дизайнерское решение? Только ли из-за двусмысленности процедура должна быть перегружена? Может ли сообщение об ошибке в этой ситуации быть альтернативным подходом?
Например, в приведенном ниже коде последний оператор 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
Этот вопрос должен был спрашивать о том, почему присваивание массива продвигает источник скалярного значения к целевому массиву; в отличие от функции массива. Я ожидаю, что это просто удобный частный случай. Любые комментарии с благодарностью принимаются в шапках попрошайничества ниже.