1

フリーフォーム Fortran を学ぶことにした最近まで、私はすべてのプログラミングを Matlab で行ってきました。Cygwin で gfortran コンパイラを使用しています。配列を入力として取り、それに対して計算を行い、新しい配列を返すことができる関数を書くことに興味があります。これが難しい仕事だと思ったことは一度もありませんでしたが、少なくとも私にとっては難しい仕事であることが証明されました. これが私の簡単なテストコードです:

    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

したがって、問題は2つあるようです.変数の型を誤って一致させ、関数を誤って宣言しています. コードは次のようになります (コメントは省略します)。

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

編集

余談ですが、他に2つの提案があります。

REAL*8(1)コンパイラやシステムに依存するため、使用するのは悪い習慣です。使用する必要がありますINTEGER, PARAMETER :: dp = SELECTED_REAL_KIND(14, 100)(ここで14は、有効な小数点以下の桁数を示し100、最大指数を表します)。次に、変数をREAL(dp) :: PorREAL(KIND=dp) :: Pおよびとして定義しますP = 1.0_dp/N

IMPLICIT NONE(2) の後に宣言する必要がありPROGRAM <name>ます。このように、明示的に宣言されていない変数はコンパイラを停止します。

于 2013-06-30T01:25:15.833 に答える