2013-03-13 99 views
1

我正在處理一個項目(這是明天到期的:/),並且當我試圖在自己寫的函數上使用單純形算法時遇到問題。它沒有工作,經過5個小時的搜索和實驗後,我發現了以下內容:FORTRAN:分段錯誤,當將數組參數傳遞給子例程

當我將函數傳遞給子例程時,此函數不能有任何數組參數。這是真的?因爲在我應該使用它的代碼中顯然應該工作。

我正在使用ifort編譯器。請參閱下面最少例如,我basicaly從http://malayamaarutham.blogspot.de/2006/02/passing-function-names-as-arguments-in.html

! Author : Kamaraju S Kusumanchi 
    ! Email : [email protected] 
    ! 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$ 
+0

這SOLN可以解決這個問題。 http://stackoverflow.com/questions/2521072/function-pointer-arrays-in-fortran。我認爲問題是func4 doensnt知道dyn_func採取什麼參數。 – yosukesabai 2013-03-14 00:09:56

回答

5

對方回答可以用來解決您的問題,但也有不使用簡單的方法指針。

在現代Fortran中幾乎沒有理由使用external。在我看到的有關Stackoverflow的Fortran問題中,它幾乎總是讓人們誤入歧途。除非你確定,否則不要使用external

你想要做的是用interface塊聲明(即描述)函數func3func4中的函數參數。這裏是如何做到這一點的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 
+0

...以及需要接口塊的具體原因是因爲被傳遞的函數(func2)具有假定的形狀參數。然後OP將需要處理這樣一個事實,即你無法將假定大小的實際參數傳遞給假設的形狀虛擬物體...... – IanH 2013-03-14 01:01:53

+0

非常正確,IanH。在我添加的示例代碼中,我也改進了這一點,但沒有提到它... – 2013-03-14 01:04:11

+0

哦,哇,這很多!它適用於簡單的東西,現在我將嘗試將其應用到其餘部分。老實說,我必須承認我之前讀過其他答案,但我仍然不明白這裏有一個詞:) 我將查找這些接口是,但現在我只是很高興它的工作,thatnks再次:) – 2013-03-14 01:24:10