Что такое скалярные значения в Фортране, и как я могу конвертировать из них в и - PullRequest
0 голосов
/ 31 августа 2018

Некоторый контекст. У меня есть этот кусок кода:

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: Что не так с этим фрагментом кода, и что я должен делать в ситуациях, подобных этой в более общем плане?

Ответы [ 2 ]

0 голосов
/ 31 августа 2018

С учетом

integer n
real x(5)

тогда, при соответствующем определении 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.

0 голосов
/ 31 августа 2018

Что неправильно, как жалуется компилятор, у вашего выражения есть результат массива, с одним элементом для каждого сравнения. То, что вы хотите, это заключить выражение в ALL (). Например:

if(.not.(all(array1(x:x,y:y) == array2(x:x,y:y)))) then
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...