从函数中返回一个数组,并将其存储在主程序中 [英] Return an array from a function and store it in the main program

查看:220
本文介绍了从函数中返回一个数组,并将其存储在主程序中的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这是主程序:

 程序集成
EXTERNAL函数
DOUBLE PRECISION函数,a ,b,sum,h
INTEGER n,i
REAL s

参数(a = 0,b = 10,n = 200)

h =(ba)/ 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

以下是函数funct(x)



pre $ 双精度函数funct(x)
IMPLICIT NONE

双精度x
INTEGER K

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

PRINT *,'函数的值是', funct

RETURN
END

我想'Sum'在Main中程序在函数 funct(x)中打印超过10个不同k值的10个不同的和。



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

解决方案

数组结果需要一个明确的接口。您还需要将 funct sum 调整为使用语句。使用显式接口需要Fortran 90+(感谢@francescalus和@VladimirF的提示),并且非常单调:

 程序整合
INTERFACE功能
功能功能(x)结果(r)
隐式无
双精度r
尺寸r(10)
双精度x
END FUNCTION
END INTERFACE
双精度a,b,sum,h
DIMENSION sum(10)
INTEGER n,i

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

h =(ba)/ 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)))

打印*,总和

完成

功能功能(x)
隐式无
双精度功能
DIMENSION功能(10)
DOUBLE PRECISION x
INTEGER K

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

PRINT *,'功能值是',功能

RETURN
END

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

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

 程序集成
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 传递给该函数。它需要作相应的调整:

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

funct = x ** 2 * k

PRINT *,'功能值为',功能

RETURN
END

这个版本只返回一个标量并填充main程序。




除此之外,我不确定使用名为 sum 内部函数具有相同的名称。这可能会导致一些混乱......


Here is the Main Program:

      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     

And below is the Function funct(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

I would like the 'Sum' in the Main Program to print 10 different sums over 10 different values of k in Function funct(x).

I have tried the above program but it just compiles the last value of Funct() instead of 10 different values in sum.

解决方案

Array results require an explicit interface. You would also need to adjust funct and sum to actually be arrays using the dimension statement. Using an explicit interface requires Fortran 90+ (thanks for the hints by @francescalus and @VladimirF) and is quite tedious:

        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

If you can, you should switch to a more modern Standard such as Fortran 90+, and use modules. These provide interfaces automatically, which makes the code much simpler.

Alternatively, you could take the loop over k out of the function, and perform the sum element-wise. This would be valid 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       ...

Notice that I pass k to the function. It needs to be adjusted accordingly:

        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

This version just returns a scalar and fills the array in the main program.


Apart from that I'm not sure it is wise to use a variable called sum. There is an intrinsic function with the same name. This could lead to some confusion...

这篇关于从函数中返回一个数组,并将其存储在主程序中的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆