0

Fortranmoduleで、コンポーネントがプロシージャ ポインターである派生データ型に初期値を代入しようとしていますが、エラー メッセージが表示されます: 予期しないポインターの割り当て。

ではmodule、プロシージャ ポインタを含む構造型に初期値を割り当てる方法は?

    module pointer_mod  

    use legendrePolynomials
    implicit none

    interface
      function func (z)
      real*8 :: func
      real*8, intent (in) :: z
      end function func
    end interface

    type proc_ptr
      procedure (func), pointer, nopass :: f_ptr
    end type proc_ptr

    type(proc_ptr), dimension(6) :: basis

    basis(1) % f_ptr => Legendre0 ! or basis(1) % f_ptr => null()

    end module pointer_mod   

どこ:

    function Legendre0(x) result(y)
    real, intent(in) :: x
    real :: y
    y = 1
    end function
4

2 に答える 2

3

通常は宣言のみが発生するサブルーチンの外部でポインター割り当てを発行するため、エラー メッセージが表示されます。代入をサブルーチン (以下を参照) に入れると、完全に機能することが示されます。ただしLegendre0()、インターフェイス宣言と一致させるために、関数も real*8 型を使用していることを確認してください (テスト目的で、Legendre 関数も同じモジュール):

module pointer_mod  
  implicit none

  interface
    function func (z)
      real*8 :: func
      real*8, intent (in) :: z
    end function func
  end interface

  type proc_ptr
    procedure (func), pointer, nopass :: f_ptr
  end type proc_ptr

  type(proc_ptr), dimension(6) :: basis


contains

  subroutine test()
    basis(1)%f_ptr => Legendre0 ! or basis(1) % f_ptr => null()
  end subroutine test

  function Legendre0(x) result(y)
    real*8, intent(in) :: x
    real*8 :: y
    y = 1
  end function Legendre0

end module pointer_mod

追加のコメントとして:次のような実際の変数を宣言することを検討する必要があります

integer, parameter :: dp = kind(1.0d0)
real(dp) :: whatever

real*8時代遅れの表記の代わりに。

于 2013-03-05T15:14:25.207 に答える
1

もう 1 つの解決策は、Legendre0 の関数ポインタを型 (proc_ptr) のすべての変数のデフォルトにすることです。

type proc_ptr
  procedure (func), pointer, nopass :: f_ptr => Legendre0
end type proc_ptr

しかし、ポインターの配列を処理しているため、おそらくそれはあなたが望むものではありません。

于 2013-03-05T15:33:07.887 に答える