1

直到最近我决定学习自由格式的 Fortran 之前,我都在 Matlab 中完成了所有的编程。我将 gfortran 编译器与 Cygwin 一起使用。我有兴趣编写可以将数组作为输入的函数,对其进行计算,然后将新数组传回。我从不认为这是一项艰巨的任务,但事实证明它至少对我来说是一项艰巨的任务。这是我的简单测试代码:

    PROGRAM RETURN_ARRAY
! Description: This program is used to test a function that returns
!              an array.

    REAL*8 :: NROOT

    PRINT *, NROOT(2, [1.0D0, 4.0D0, 9.0D0, 16.0D0, 25.0D0])

END PROGRAM RETURN_ARRAY


FUNCTION NROOT(N, X) RESULT(Y)
! Description: This function calculates the Nth root of a real number
!              or array of real numbers.
!
! Inputs: N - desired Nth root
!         X - real number or array of real numbers to take Nth root of
!
! Outputs: Y - Nth root of real number or array of real numbers, X

    INTEGER, INTENT(IN) :: N
    REAL*8, INTENT(IN)  :: X(:)
    REAL*8              :: P
    REAL*8              :: Y(SIZE(X))

    P = 1.0D0/N
    Y = X**P

END FUNCTION NROOT

`我编译这个程序和内部函数如下:

gfortran RETURN_ARRAY.f90 -o MAIN.exe

程序编译没有错误。但是,当我尝试运行该程序时,我在终端中得到以下输出:

Segmentation fault (core dumped)

我将不胜感激解决此问题的任何帮助。提前致谢。

4

1 回答 1

0

当我尝试编译(Fedora 18 上的 gfortran 4.8)时,我首先收到一个错误,内容为

Warning: Type mismatch in argument 'n' at (1); passed REAL(8) to INTEGER(4)

所以有第一个错误。更改2.d02,我收到以下错误

Error: Procedure 'nroot' at (1) with assumed-shape dummy argument 'x' must have an explicit interface

所以这是另一个错误。简单地使用一个contains结构(见下文),我得到以下结果:

   1.0000000000000000        2.0000000000000000        3.0000000000000000        4.0000000000000000        5.0000000000000000

因此,您的问题似乎有两个方面:您错误地匹配变量类型和错误地声明了一个函数。以下是您的代码应该是什么样子(无注释):

PROGRAM RETURN_ARRAY
    PRINT *, NROOT(2, [1.0D0, 4.0D0, 9.0D0, 16.0D0, 25.0D0])
  CONTAINS
    FUNCTION NROOT(N, X) RESULT(Y)
       INTEGER, INTENT(IN) :: N
       REAL*8, INTENT(IN)  :: X(:)
       REAL*8              :: P
       REAL*8              :: Y(SIZE(X))

       P = 1.0D0/N
       Y = X**P

    END FUNCTION NROOT
END PROGRAM RETURN_ARRAY

编辑

顺便说一句,我还有另外两个建议:

(1) 使用它是不好的做法,REAL*8因为它依赖于编译器和/或系统。您应该使用INTEGER, PARAMETER :: dp = SELECTED_REAL_KIND(14, 100)(此处14表示有效小数位数并100表示最大指数)。然后,您将变量定义为REAL(dp) :: PorREAL(KIND=dp) :: PP = 1.0_dp/N

(2) 你应该IMPLICIT NONE在之后声明PROGRAM <name>。这样,任何未显式声明的变量都会停止编译器。

于 2013-06-30T01:25:15.833 回答