Fortran中的标量值到底是什么,如何进行转换
一些背景。我有一段代码:Fortran中的标量值到底是什么,如何进行转换,fortran,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) == ar
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:这段代码有什么问题,在类似这样的情况下,我应该做些什么?错误的是,正如编译器所抱怨的,您的表达式有一个数组结果,每个比较都有一个元素。您需要的是将表达式包装为ALL()。例如:
if(.not.(all(array1(x:x,y:y) == array2(x:x,y:y)))) then
给定
然后,给出n
x(n)
是x
的数组元素,并且
x(n:n)
是x
的数组部分
数组元素是标量,而数组部分本身是大小为1的数组
正如史蒂夫·莱昂内尔所说,在这个问题上
array1(x:x,y:y) == array2(x:x,y:y)
是一个数组值表达式(尽管大小也是1),可以使用ALL
将其简化为标量表达式。然而
array1(x,y) == array2(x,y)
是标量表达式,包含两个操作数标量数组元素
在参考
x(n)
中,我们有一个标量n
的数组元素。如果使用n
数组,我们将使用一个数组作为x
的向量下标,为什么不简单地删除数组节表示法呢<代码>如果(.not.(array1(x,y)=array2(x,y))您也可以更改为“如果(array1(x,y)/=array2(x,y)),然后”。。。然而,由于array1和array2被定义为实数,因此需要对两个实数的不同程度有一些理解,即可以容忍多小的差异。这些建议都没有帮助,因为IF表达式仍然是一个数组。它必须简化为一个标量,这就是一切所做的。@SteveLionel,array1(x,y)==array2(x,y)
数组表达式是什么array1(x,y)
是数组array1
的一个元素array2(x,y)
是array2
的一个元素。数组元素是标量的。@SteveLionel,我提出了两个建议,这两个建议都没有被采纳。一个是简化if逻辑,另一个是强调比较2个实值的问题。虽然他们可能没有解决OP问题,但他们确实解决了所编写代码的适用性,突出了编码方法的重大问题。
array1(x,y) == array2(x,y)