Тип конфликта maxloc в Фортране - PullRequest
0 голосов
/ 20 ноября 2018

У меня есть следующая программа на Фортране

PROGRAM main

  IMPLICIT NONE

  INTEGER                          :: i
  INTEGER,dimension(:),allocatable :: x0

  allocate(x0(1:25))
  DO i=1,25
     x0(i)=i
  END DO

  print*,"maxloc de x0 est 25, en effet",maxloc(x0)

  print*,"Cinq fois maxloc(x0)",INT(maxloc(x0))

  print*,"f applique a la fonction",f(maxloc(x0))

  print*,"f1 applique a la fonction",f1(INT(maxloc(x0)))

  CONTAINS

  FUNCTION f(maxlocec)
    IMPLICIT NONE
    !Entrées
    INTEGER,dimension(1) :: maxlocec
    !Sorties
    INTEGER,dimension(1) :: f

    f=maxlocec**2

  END FUNCTION f

  FUNCTION f1(maxlocec)
    IMPLICIT NONE
    !Entrées
    INTEGER :: maxlocec
    !Sorties
    INTEGER :: f1

    f1=maxlocec**2

  END FUNCTION f1

END PROGRAM

, когда я ее запускаю, я получаю следующее сообщение об ошибке:

print*,"f1 applique a la fonction",f1(INT(maxloc(x0)))
                                        1
Error: Rank mismatch in argument 'maxlocec' at (1) (0 and 1)

Я попытался f1(maxloc(x0)), и она не работала,поэтому я подумал, что f1(INT(maxloc(x0))) будет работать, а это не так.

Вывод maxloc представляется целым числом, но это не так.Как это решить?

1 Ответ

0 голосов
/ 20 ноября 2018

Процедура maxloc не возвращает int, но в этом случае одномерный массив размера 1 типа int. Из стандарта:

MAXLOC (ARRAY, DIM [, MASK, KIND, BACK]) или MAXLOC (ARRAY [, MASK, KIND, BACK])

...

Характеристики результата. Integer. Если KIND присутствует, тип вида параметр, указанный в значении KIND; в противном случае вид Параметр type является целочисленным типом по умолчанию. Если DIM не появляются, результат - массив ранга один и размера, равного ранг ARRAY; в противном случае результат имеет ранг n - 1 и форму [d1, d2,. , , , dDIM − 1, dDIM + 1,. , , , dn], где [d1, d2,. , , , дн] есть форма решетки.

Так что в вашем случае вам, вероятно, понадобится: print*,"f1 applique a la fonction",f1(maxloc(x0,1))

...