Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Function 从函数返回数组并将其存储在主程序中_Function_Fortran_Gfortran_Fortran77_Intel Fortran - Fatal编程技术网

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

Function 从函数返回数组并将其存储在主程序中,function,fortran,gfortran,fortran77,intel-fortran,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+f

以下是主要节目:

      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     
下面是函数funct(x)

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


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

数组结果需要显式接口。您还需要使用
dimension
语句将
funct
sum
调整为实际的数组。使用显式接口需要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+,并使用
模块
。它们自动提供接口,这使得代码更加简单

或者,您可以将
k
上的循环从函数中取出,并执行sum元素。这将是有效的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
的变量是否明智。有一个同名的。这可能会导致一些混乱…

我不理解这个问题。特别是,为什么要“10个不同的总和”?[我可以想象“10个不同的值”部分]啊,我注意到标题中有“函数数组”。问题中没有数组。感谢@francescalus相应地更改问题。现在看起来更合适了。非常感谢你,亚历克斯。我是Fortran新手,这真的很有帮助。再次感谢:)@swetas如果这能解决您的问题,您可以随时接受答案;-)
        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