【问题标题】:Fortran "ANY" function error while checking if a array contains a value检查数组是否包含值时出现 Fortran“ANY”函数错误
【发布时间】:2020-04-24 01:52:17
【问题描述】:

我想检查一个二维数组是否包含另一个一维数组的值。

   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。目前您只是在测试数组的单个标量元素,因此不需要ANY。但是,我们不知道循环中的内容,因此不可能知道您真正想要做什么。此外,您可以分别在内部 jl 循环之外对 ik 提升这些 if 测试和/或按外观重新排序循环。
  • 第二个@RussF,也请不要说“所有变量都已正确定义”,向他们展示 - 变量声明对于理解问题至关重要。但到目前为止,正如 RussF 所暗示的那样,最好的方法是展示一个简短、完整的程序来显示您遇到的问题
  • 这 - stackoverflow.com/questions/29631649/… - 可能有用。它甚至可能是重复的,但我没有仔细检查。
  • 不,不是重复的,而是密切相关的
  • 好吧,看起来微笑的人现在赢了@IanBush,这个问题已经重新打开了:-)

标签: arrays for-loop if-statement fortran


【解决方案1】:

您的问题是 ANY 是一种归约操作,它采用存储在逻辑数组中的许多值并将它们归约为单个值,在本例中为值 .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

您的直接问题是您只是为 ANY 提供了一个标量值,而不是一个数组,因此出现了错误。简单的

if (r1==id(k)) then

将解决眼前的问题。

但是这里可能有一种方法可以让您使用 ANY,这可能是解决您正在做的事情的最佳方法。然而,如果没有包括变量声明在内的其余代码,这是不可能的。

【讨论】:

  • 非常感谢!
猜你喜欢
  • 2012-01-10
  • 2011-04-23
  • 2019-08-10
  • 1970-01-01
  • 2019-12-15
  • 2015-01-01
  • 2021-07-15
  • 1970-01-01
  • 2018-08-21
相关资源
最近更新 更多