Max*_*nko 1 arrays fortran function subroutine
我正在研究一个项目(明天到期:/),当我尝试在我自己编写的函数上使用单纯形算法时遇到问题.它没有用,经过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
Run Code Online (Sandbox Code Playgroud)
这是输出:
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$
Run Code Online (Sandbox Code Playgroud)
另一个答案可用于解决您的问题,但有一些更简单的方法,而不使用指针.
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
Run Code Online (Sandbox Code Playgroud)