7

プロシージャポインター(Fortran 2003の新機能)を使用して初等関数をポイントしようとしていますが、機能しません。私は本当に関数が必要ELEMENTALであり、それへのポインタが必要です。Fortranで初等関数を指すことは本当に不可能ですか?

    module elemfunc
    implicit none

    contains
        elemental function fun111(x) result(y)
        real*8, intent(in) :: x
        real*8 :: y 

            y = x**2+1

        end function fun111
    end module elemfunc


    program testptr
    use elemfunc
    implicit none

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

        procedure (func), pointer :: ptr
        ptr => fun111

        print *, ptr( (/1.0d0,2.0d0/) )

    end program testptr

エラーメッセージ:

main.f90:12.7:ptr=>fun111
                     1
Nonintrinstic elemental procedure pointer 'func111' is invalid in procedure pointer assignment at (1)
4

2 に答える 2

4

fortran 2003標準の段落7.4.2 Pointer Assignmentでは、これは許可されていないと明示的に述べられています。

C728 (R742) The proc-target shall not be a nonintrinsic elemental procedure

(この制約は、Fortran 2008標準にはまだ存在しているため、緩和されていません。)

于 2013-03-05T14:30:12.643 に答える
3

私はこれとまったく同じ問題を抱えていましたが、gfortranでコンパイルするまで、それが問題であることにさえ気づきませんでした。残念ながら、要素プロシージャにダミーのプロシージャ引数を設定することも禁止されています。ただし、少し厄介ですが、必要な機能を実現することは可能です。

合法的にできることは、要素関数に純粋関数を呼び出させることです。必要に応じて、初等関数は型にバインドされる場合とされない場合があります。

オプション1

プロシージャポインタと関数をモジュール内に配置します。

module A
  implicit none

  procedure(func_IF), pointer :: ptr => null()

  abstract interface
    pure function func_IF(x)
      real, intent(in) :: x
      real :: func_IF
    end function
  end interface
contains
  ! Non type bound elemental
  elemental function myfun1(x) result(r)
    real, intent(in) :: x
    real :: r    
    if(associated(ptr)) r = ptr(x)
  end function
end module

オプション2

ポインタと関数の両方を派生型の中に入れます。

module B
  implicit none

  type :: foo
    procedure(func_IF), nopass, pointer :: ptr => null()
  contains
    procedure, pass :: myfun2
  end type

  abstract interface
    pure function func_IF(x)
      real, intent(in) :: x
      real :: func_IF
    end function
  end interface
contains
  ! Type bound elemental
  elemental function myfun2(this, x) result(r)
    class(foo), intent(in) :: this
    real, intent(in) :: x
    real :: r    
    if(associated(this%ptr)) r = this%ptr(x)
  end function
end module

小さなテストプログラム:

program main
  use A
  use B
  implicit none

  type(foo) :: myfoo
  myfoo%ptr => bar
  ptr => bar

  print*, myfun1([10., 20.])
  print*, myfoo%myfun2([10., 20.])
contains
  ! Demo pure function with interface func_IF
  pure function bar(x)
    real, intent(in)    :: x
    real                :: bar
    bar = x**2
  end function
end
于 2014-06-13T12:39:50.387 に答える