Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Fortran中不将标量参数提升到数组_Fortran_Overloading_Fortran90 - Fatal编程技术网

Fortran中不将标量参数提升到数组

Fortran中不将标量参数提升到数组,fortran,overloading,fortran90,Fortran,Overloading,Fortran90,为什么Fortran会将标量表达式提升为表达式中的数组,而不是作为过程的参数?特别是,为什么标准机构做出这个设计决定?是否仅仅是因为模棱两可,程序是否应该过载?在这种情况下,错误消息是否可以作为替代方法 例如,在下面的代码中,最后一条语句,x=foo(7),生成GFortran错误:error:a参数在(1)(1和0)中的秩不匹配 这个问题应该问为什么数组赋值会将标量值源提升为数组目标;与数组函数不同。我想这只是一个方便的特例。感谢您在下面的乞讨帽中收到的任何评论。使用显式接口调用Fortran

为什么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