从函数返回一个数组并将其存储在主程序中

时间:2015-08-05 19:02:02

标签: function fortran gfortran fortran77 intel-fortran

这是主程序:

      PROGRAM integration
      EXTERNAL funct
      DOUBLE PRECISION funct, a , b, sum, h
      INTEGER n, i
      REAL s

      PARAMETER (a = 0, b = 10, n = 200)  

      h = (b-a)/n
      sum = 0.0

      DO i = 1, n
         sum = sum+funct(i*h+a)
      END DO

      sum = h*(sum-0.5*(funct(a)+funct(b)))

      PRINT *,sum

      CONTAINS

      END     

以下是功能函数(x)

      DOUBLE PRECISION FUNCTION funct(x)
      IMPLICIT NONE

      DOUBLE PRECISION x
      INTEGER K

      Do k = 1,10
      funct = x ** 2 * k
      End Do

      PRINT *, 'Value of funct is', funct

      RETURN
  END

我希望主程序中的'Sum'在函数funct(x)中的10个不同k值上打印10个不同的和。

我已尝试过上述程序,但它只编译了Funct()的最后一个值,而不是总和的10个不同值。

1 个答案:

答案 0 :(得分:1)

数组结果需要显式接口。您还需要使用funct语句将sumdimension调整为实际数组。使用显式接口需要Fortran 90+(感谢@francescalus和@VladimirF的提示)并且非常乏味:

        PROGRAM integration
        INTERFACE funct
          FUNCTION funct(x) result(r)
            IMPLICIT NONE
            DOUBLE PRECISION r
            DIMENSION r( 10 )
            DOUBLE PRECISION x
          END FUNCTION
        END INTERFACE
        DOUBLE PRECISION a , b, sum, h
        DIMENSION sum( 10)
        INTEGER n, i

        PARAMETER (a = 0, b = 10, n = 200)  

        h = (b-a)/n
        sum = 0.0

        DO i = 1, n
           sum = sum+funct(i*h+a)
        END DO

        sum = h*(sum-0.5*(funct(a)+funct(b)))

        PRINT *,sum

        END  

        FUNCTION funct(x)
        IMPLICIT NONE
        DOUBLE PRECISION funct
        DIMENSION funct( 10)
        DOUBLE PRECISION x
        INTEGER K

        Do k = 1,10
          funct(k) = x ** 2 * k
        End Do

        PRINT *, 'Value of funct is', funct

        RETURN
        END

如果可以,您应该切换到更现代的标准,例如Fortran 90+,并使用modules。它们自动提供接口,使代码更简单。

或者,您可以将k的循环从函数中取出,并按元素执行求和。这将是有效的FORTRAN 77:

        PROGRAM integration
c       ...
        DIMENSION sum( 10)
c       ...
        INTEGER K
c       ...
        DO i = 1, n
          Do k = 1,10
            sum(k)= sum(k)+funct(i*h+a, k)
          End Do
        END DO
c       ...

请注意,我将k传递给该函数。需要相应调整:

        DOUBLE PRECISION FUNCTION funct(x,k)
        IMPLICIT NONE
        DOUBLE PRECISION x
        INTEGER K

        funct = x ** 2 * k

        PRINT *, 'Value of funct is', funct

        RETURN
        END

此版本只返回一个标量并填充主程序中的数组。

除此之外,我不确定使用名为sum的变量是明智的。有一个intrinsic function具有相同的名称。这可能会引起一些混乱......