Fortran中maxloc的类型冲突

时间:2018-11-20 09:23:03

标签: fortran rank

我有以下Fortran程序

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 :(得分:2)

maxloc例程不会返回int,而是返回int类型的大小为1的一维数组。 根据标准:

  

MAXLOC(ARRAY,DIM [,MASK,KIND,BACK])或   MAXLOC(数组[,掩码,种类,后退])

     

...

     

结果特征。整数。如果存在KIND,则为实物类型   参数是由KIND的值指定的;否则那种   type参数是默认整数类型的参数。如果DIM不   出现时,结果是排名为1且大小等于   ARRAY等级;否则,结果的等级为n − 1,形状为[d1,   d2 ,。 。 。 ,dDIM-1,dDIM + 1,...。 。 。 ,dn],其中[d1,d2,。 。 。 ,dn]是   ARRAY的形状。

因此,在您的情况下,您可能需要: print*,"f1 applique a la fonction",f1(maxloc(x0,1))