Arrays “Fortran”;任何;检查数组是否包含值时发生函数错误

Arrays “Fortran”;任何;检查数组是否包含值时发生函数错误,arrays,for-loop,if-statement,fortran,Arrays,For Loop,If Statement,Fortran,我想检查一个2D数组是否包含来自其他1D数组的值 do i=1,nlines do j=1,nchecks(i) if (type(i).eq.4) then do k=1,nlines do l=1,nchecks(k) if (type(k).eq.3) then if (ANY(con(i,j)==id(k))) then ... 但我面临以下错误: test1.f(98): error #6361: An array-valued arg

我想检查一个2D数组是否包含来自其他1D数组的值

   do i=1,nlines
   do j=1,nchecks(i)
   if (type(i).eq.4) then
   do k=1,nlines
   do l=1,nchecks(k)
   if (type(k).eq.3) then
   if (ANY(con(i,j)==id(k))) then
   ...
但我面临以下错误:

test1.f(98): error #6361: An array-valued argument is required in this context.   [ANY]
       if (ANY(conn(i,j)==id2(k))) then
我做错了什么?我也试过类似的东西

   do i=1,nlines
   do j=1,nchecks(i)
   if (type(i).eq.4) then
   r1=conn(i,j)
   do k=1,nlines
   do l=1,nchecks(k)
   if (type(k).eq.3) then
   if (ANY(r1==id(k))) then
   ...

但这也带来了同样的错误。所有变量都已正确定义,格式没有错误。我是否以错误的方式使用任何命令

您的问题是,ANY是一个缩减操作,它接受存储在逻辑数组中的许多值,并将它们缩减为单个值,在本例中为value.True。数组中的任何值都为true或.False。如果它们都是假的。这里有一个非常简单的例子

ian@eris:~/work/stack$ cat any.f90
Program Any_test

  Implicit None

  Write( *, * ) Any( [ .True. , .False. ] )
  Write( *, * ) Any( [ .False., .False. ] )

End Program Any_test

ian@eris:~/work/stack$ gfortran -std=f2008 -Wall -Wextra -fcheck=all any.f90 
ian@eris:~/work/stack$ ./a.out
 T
 F
直接的问题是,您只提供了一个标量值,而不是一个数组,因此出现了错误。简单地

if (r1==id(k)) then
将解决眼前的问题


但是这里可能有一种方法,你可以使用任何一种,这可能是解决你正在做的事情的最好方法。但是,如果没有包括变量声明在内的其余代码,就不可能说。

您的问题是,任何操作都是一个缩减操作,它会获取存储在逻辑数组中的许多值,并将它们缩减为单个值,在本例中为value.True。数组中的任何值都为true或.False。如果它们都是假的。这里有一个非常简单的例子

ian@eris:~/work/stack$ cat any.f90
Program Any_test

  Implicit None

  Write( *, * ) Any( [ .True. , .False. ] )
  Write( *, * ) Any( [ .False., .False. ] )

End Program Any_test

ian@eris:~/work/stack$ gfortran -std=f2008 -Wall -Wextra -fcheck=all any.f90 
ian@eris:~/work/stack$ ./a.out
 T
 F
直接的问题是,您只提供了一个标量值,而不是一个数组,因此出现了错误。简单地

if (r1==id(k)) then
将解决眼前的问题


但是这里可能有一种方法,你可以使用任何一种,这可能是解决你正在做的事情的最好方法。但是,如果没有包含变量声明的其余代码,就不可能说。

是的,您使用的
ANY
不正确。目前您只是测试数组的单个标量元素,因此不需要
ANY
。然而,我们不知道循环中有什么,所以不可能知道您真正想要做什么。此外,您可能可以将
if
测试分别提升到
i
k
内部
j
l
循环之外,并/或根据外观对循环重新排序。第二@RussF,也请不要说“所有变量都已正确定义”,向他们展示-变量声明对于理解问题至关重要。但是,正如俄罗斯科学基金会所暗示的那样,到目前为止,最好的办法是展示一个简短、完整的程序,显示出你所遇到的问题。这可能是有用的。它甚至可能是一个副本,但我没有仔细检查。不,它不是一个副本,但它是密切相关的。好吧,看起来微笑者现在赢了@IanBush,问题被重新打开:-)是的,你使用的
ANY
不正确。目前您只是测试数组的单个标量元素,因此不需要
ANY
。然而,我们不知道循环中有什么,所以不可能知道您真正想要做什么。此外,您可能可以将
if
测试分别提升到
i
k
内部
j
l
循环之外,并/或根据外观对循环重新排序。第二@RussF,也请不要说“所有变量都已正确定义”,向他们展示-变量声明对于理解问题至关重要。但是,正如俄罗斯科学基金会所暗示的那样,到目前为止,最好的办法是展示一个简短、完整的程序,显示出你所遇到的问题。这可能是有用的。它甚至可能是重复的,但我没有仔细检查。不,它不是重复的,但它是密切相关的。好吧,看起来微笑者现在赢了@IanBush,问题已经被重新提出:-)非常感谢!非常感谢你!