Fortran中不将标量参数提升到数组
为什么Fortran会将标量表达式提升为表达式中的数组,而不是作为过程的参数?特别是,为什么标准机构做出这个设计决定?是否仅仅是因为模棱两可,程序是否应该过载?在这种情况下,错误消息是否可以作为替代方法 例如,在下面的代码中,最后一条语句,Fortran中不将标量参数提升到数组,fortran,overloading,fortran90,Fortran,Overloading,Fortran90,为什么Fortran会将标量表达式提升为表达式中的数组,而不是作为过程的参数?特别是,为什么标准机构做出这个设计决定?是否仅仅是因为模棱两可,程序是否应该过载?在这种情况下,错误消息是否可以作为替代方法 例如,在下面的代码中,最后一条语句,x=foo(7),生成GFortran错误:error:a参数在(1)(1和0)中的秩不匹配 这个问题应该问为什么数组赋值会将标量值源提升为数组目标;与数组函数不同。我想这只是一个方便的特例。感谢您在下面的乞讨帽中收到的任何评论。使用显式接口调用Fortran
x=foo(7)
,生成GFortran错误:error:a参数在(1)(1和0)
中的秩不匹配
这个问题应该问为什么数组赋值会将标量值源提升为数组目标;与数组函数不同。我想这只是一个方便的特例。感谢您在下面的乞讨帽中收到的任何评论。使用显式接口调用Fortran的过程(在使用模块过程时自动获得)需要TKR(类型、种类、等级)匹配。由于数组的类型不同于标量,更不用说秩不匹配了,这是不允许的 是不是因为含糊不清导致程序过载 那会是个问题,是的 在这种情况下,错误消息是否可以作为替代方法
粉红色的独角兽会存在吗?也许吧,但据我所知,他们没有。照此看来,Fortran标准目前要求TKR匹配,因此符合标准的编译器必须执行此要求。如果您想改变这一点,我建议您向标准委员会提出建议。如果您想让函数处理缩放器和数组参数,请将其声明为“基本”并使用缩放器伪参数。然后它将能够处理scaler和数组实际参数,包括scaler表达式。这能满足你的需要吗 变化:
elemental function foo(a) result(b)
integer, intent (in) :: a
integer :: b
b = a+1
end function foo
也许他们提供了一种方法来做你想做的事情,一种方法就足够了?我认为答案很清楚。让我们稍微修改一下您的示例:
module m
public :: foo
contains
function foo(a) result(b)
integer, dimension(:) :: a
integer, dimension(size(a)) :: b
b = a+1
a(2) = -777 ! new line; modify one element
end function foo
end module m
program p
use m
integer :: x
integer, dimension(4) :: y
x = 7
y = foo(x) ! pass a scalar
end program p
打电话给foo后x应该是什么
当然,参数传递的语义可以根据它是否是intent(in)
变量而改变,但这并不能为程序员澄清问题
如果函数调用应该以某种方式“分布”在数组元素上,那么正如MSB所指出的,元素是一种方法。否则,只需确保参数与参数匹配。谢谢janneb。我很感激你的回答,但我实际上在寻找“为什么”。这可能不像OP想要的那样一般,因为elemental对函数的功能有很多限制。当然可以。大多数内置函数都是基本的,不是吗。元素函数需要arity>1才能将标量提升为数组。我的问题应该更好地集中在赋值语句上,它将提升标量。但这更有意义:赋值语句是特殊的。我最近看了太多APL了…谢谢。我想这个论点应该是
intent(in)
。这就是为什么我加入了参数
参数,y
。正如你所说,elemental
是一条路要走。
module m
public :: foo
contains
function foo(a) result(b)
integer, dimension(:) :: a
integer, dimension(size(a)) :: b
b = a+1
a(2) = -777 ! new line; modify one element
end function foo
end module m
program p
use m
integer :: x
integer, dimension(4) :: y
x = 7
y = foo(x) ! pass a scalar
end program p