首页 > 解决方案 > Fortran中maxloc的类型冲突

问题描述

我有以下 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似乎是一个整数,但不是。解决它的方法是什么?

标签: fortranrank

解决方案


maxloc 例程不返回标量整数,但在这种情况下,返回大小为 1 的一维整数数组。来自标准:

MAXLOC (ARRAY, DIM [, MASK, KIND, BACK]) 或 MAXLOC (ARRAY [, MASK, KIND, BACK])

...

结果特征。整数。如果存在 KIND,则 kind 类型参数由 KIND 的值指定;否则 kind 类型参数是默认整数类型。如果 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))

推荐阅读