1

私はプロジェクトに取り組んでおり (これは明日予定です:/)、自分で書いた関数でシンプレックス アルゴリズムを使用しようとしたときに問題が発生しました。うまくいきませんでした.5時間の検索と実験の後、次のことがわかりました。

関数をサブルーチンに渡すとき、この関数は配列引数を持つことができません。これは本当ですか?私が使用することになっているコードでは、明らかに動作する必要があるためです。

私は ifort コンパイラを使用しています。私が基本的にhttp://malayamaarutham.blogspot.de/2006/02/passing-function-names-as-arguments-in.htmlから取った最小限の例については、以下を参照してください

  ! Author : Kamaraju S Kusumanchi
  ! Email  : kamaraju@gmail.com
  ! Last edited : Sun Feb  5 2006
  !
  ! Sample program demonstrating the use of external attribute.        This program
  ! shows how to pass function names as arguments in Fortran 90       programs.
  !
  ! Compilation and execution steps
  ! $gfortran passing_functions.f90 -o passing_functions
  ! $./passing_functions
  !  beta =    5.500000
  !  beta =    1.500000
  !
  ! I would appreciate any comments, feedback, criticism,       mistakes, errors etc.,
  !   (however minor they are)
  !
  module dummy
    implicit none
  contains
  !------------------------------------------------------------------------------
  function func1(a)
    implicit none
    real :: a
    real :: func1

    func1 = a+5
  end function func1
  !------------------------------------------------------------------------------
  function func2(b)
    implicit none
    real :: b(:)
    real :: func2

    func2 = b(1)
  end function func2
  !------------------------------------------------------------------------------
  function func3(dyn_func, c)
    implicit none
    real :: c
    real, external :: dyn_func
    real :: func3

    func3 = dyn_func(c)
  end function func3
  !------------------------------------------------------------------------------
  function func4(dyn_func, c)
    implicit none
    real :: c(*)
    real, external :: dyn_func
    real :: func4

    func4 = dyn_func(c)
  end function func4
  end module dummy
  !------------------------------------------------------------------------------

  program passing_functions
    use dummy
    implicit none

    real :: alpha=0.5, beta
    real :: gamma(2) = (/10,20/)

    beta = func3(func1, alpha)
    write(*,*) 'beta = ', beta
    beta = func4(func2, gamma)
    write(*,*) 'beta = ', beta
  end program passing_functions

これは出力です:

zeus$ passing.out
 beta =    5.500000    
forrtl: severe (174): SIGSEGV, segmentation fault occurred
Image              PC                Routine            Line        Source             
passing.out        0000000000402D44  Unknown               Unknown  Unknown
passing.out        0000000000402C7C  Unknown               Unknown  Unknown
libc.so.6          00002AFF7915D23D  Unknown               Unknown  Unknown
passing.out        0000000000402B79  Unknown               Unknown  Unknown
zeus$ 
4

1 に答える 1

5

他の答えを使用して問題を解決できますが、ポインターを使用しない簡単な方法があります。

external最新の Fortran で使用する理由はほとんどありません。私が Stackoverflow で見る Fortran の質問では、ほとんどの場合、人々を間違ったアプローチに導きます。本当に確信がない限り、使用しないでくださいexternal

やりたいことは、関数内func3およびブロックfunc4で関数の引数を宣言 (つまり、記述) することです。interfaceこれを行う方法は次のとおりfunc4です...あなたは理解できるはずですfunc3

 function func4(dyn_func, c)
    implicit none
    real, dimension (:) :: c
    interface
       function dyn_func (x)
          real :: dyn_func
          real, dimension (:) :: x
       end function dyn_func
    end interface
    real :: func4

    func4 = dyn_func(c)
  end function func4
于 2013-03-14T00:59:14.590 に答える