使用Fortran IF构造查找两个数组之间的匹配值

时间:2018-05-02 14:47:44

标签: arrays if-statement fortran match fortran90

在继续执行代码之前,我需要使用IF条件来确定数组中的整数(A)是否与另一个数组(B)中的整数匹配。这些数组长度不等,包含唯一的值,这些值都是正数。

我知道我可以使用以下方法找到匹配的值:

DO I = 1,SIZE(A)
Match(J)=(ANY(A(I)==B))

但是IF...THEN构造不接受此格式。我还没有找到一种方法来实现它在线和一般测试。我在这里缺少什么?

编辑: 作为替代方案,我尝试了以下代码:

   INTEGER :: I , K, B(900),C(900),I1,ID3, IP
   INTEGER, INTENT(IN)           :: A, N

       OPEN(12,FILE='../B.dat')
       DO I=1,817
          READ(12,*)B(I),C(I)
       END DO

       DO I = 1,SIZE(A)
        DO K = 1,SIZE(B)
         IF (I.EQ.K) THEN
             DO IP = N-9,N
                ID3 = I1 +A*(IP-1)
         END DO
         END DO
         END DO

然而,K会在整个循环中发生变化,因此代码不适用于匹配。然后我尝试了:

DO I = 1, SIZE(A)
  I1 =ID(I)
    DO IP = N-9,N
      ID3 = I1 +A*(IP-1)
    END DO

但是我收到了分段错误:

  

_____________ runco​​de :: main :: | runCode:无法运行| C:\ TELEMAC \ VEG \ May \ PRIVEtest.cas_2018-05-02-16h57min04s \ out_testMedit.exe   | ~~~~~~~~~~~~~~~~~~ |程序接收信号SIGSEGV:分割   错误 - 无效的记忆参考。 | | Backtrace出现此错误:   |#0 ffffffffffffffff | ~~~~~~~~~~~~~~~~~~

1 个答案:

答案 0 :(得分:3)

您的示例中包含太多无关变量,同时未向我们提供正确评估您所需内容的信息。

如果您只想检查两个可能大小不等的数组AB是否共享至少一个元素,那么您可以使用此结构:

any([(any(A(i) == B), i = 1, size(A))])

让我们进入细节:

any(A(i) == B)

这会检查i的{​​{1}}元素是否在A中的任何位置。返回一个逻辑。然后,我为B的所有元素创建了一个临时数组:

A

然后只需在[(any(A(i) == B), i = 1, size(A))] 周围添加any(),您就可以在IF语句中使用它:

program my_any

    implicit none
    integer :: A(3), B(4), i

    A = [1, 2, 3]
    B = [6, 3, 4, 10]

    if (any([(any(A(i) == B), i=1, size(A))])) then
        print *, "YES"
    else
        print *, "NO"
    end if

end program my_any