Использование конструкции Fortran IF для поиска совпадающих значений между двумя массивами - PullRequest
0 голосов
/ 02 мая 2018

Мне нужно использовать условие IF, чтобы определить, совпадает ли целое число в массиве (A) с целым числом в другом массиве (B), прежде чем продолжить работу с кодом. Массивы имеют неодинаковую длину и содержат уникальные значения, которые являются положительными.

Я знаю, что могу найти подходящие значения, используя:

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

Однако этот формат не принимается конструкцией IF...THEN. Я еще не нашел способ реализовать это, просматривая онлайн и общее тестирование. Что мне здесь не хватает?

EDIT: В качестве альтернативы я попробовал следующий код:

   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

Однако я получил ошибку сегментации:

_____________ runcode :: main:: | runCode: Не удалось запустить | C: \ TELEMAC \ VEG \ May \ PRIVEtest.cas_2018-05-02-16h57min04s \ out_testMedit.exe | ~~~~~~~~~~~~~~~~~~ | Программа получила сигнал SIGSEGV: Сегментация ошибка - недействительная ссылка на память. | | Обратный след для этой ошибки: | # 0 ffffffffffffffff | ~~~~~~~~~~~~~~~~~~

1 Ответ

0 голосов
/ 03 мая 2018

В вашем примере слишком много не относящихся к делу переменных, и в то же время вы не предоставляете нам информацию для правильной оценки того, что вы хотите.

Если вы просто хотите проверить, имеют ли два массива A и B возможно неравного размера хотя бы один элемент, то вы можете использовать эту конструкцию:

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

Давайте углубимся в детали:

any(A(i) == B)

Проверяет, находится ли i-й элемент 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
...