什么是Fortran中的标量值?如何在它们之间进行转换

时间:2018-08-30 23:37:19

标签: fortran

某些上下文。我有这段代码:

function areeq(array1,array2) result(eq)
real :: array1(1:100,1:100), array2(1:100,1:100)
logical :: eq
integer :: x,y,f
do x=1,100
  do y = 1,100
    print *,array1(x:x,y:y)
    print *,array2(x:x,y:y)
    if(.not.(array1(x:x,y:y) == array2(x:x,y:y))) then
      eq = .false.
      return
    end if

    read *,f
  end do
end do
eq = .true.
return
end function

但是,当我尝试运行它时,它会引发以下错误消息:

if(.not.(array1(x:x,y:y) == array2(x:x,y:y))) then
       1
Error: IF clause at (1) requires a scalar LOGICAL expression

这是我第二次遇到需要标量的问题,尽管我最后一次设法凑齐了临时工作,但我确实应该而且必须能够处理他们正确。

因此,TL; DR:这段代码有什么问题,在这种情况下我应该怎么做?

2 个答案:

答案 0 :(得分:7)

给予

integer n
real x(5)

然后,给定n

的适当定义
x(n)

x的数组元素,

x(n:n)

x的数组部分。

array元素是标量,而array部分本身是大小为 的数组。

正如史蒂夫·莱昂内尔(Steve Lionel)所说,在问题中,

array1(x:x,y:y) == array2(x:x,y:y)

是一个数组值表达式(尽管大小仍为1),可以使用ALL简化为标量表达式。但是

array1(x,y) == array2(x,y)

是标量表达式,具有两个操作数标量数组元素。


在引用x(n)中,我们有一个标量n的数组元素。如果使用n数组,我们将改为使用x的向量下标作为数组。

答案 1 :(得分:2)

问题是,正如编译器抱怨的那样,您的表达式具有数组结果,每个比较都具有一个元素。您想要的是将表达式包装在ALL()中。例如:

sudo port -v selfupdate