私はプロジェクトに取り組んでおり (これは明日予定です:/)、自分で書いた関数でシンプレックス アルゴリズムを使用しようとしたときに問題が発生しました。うまくいきませんでした.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$