2011-10-04 32 views
3

這期間與某些庫鏈接時,掛就是我的小例子:函數調用停止/含寫語句時,但只編譯

program test  
    implicit none 
    real :: testfunc 
    write(*,*) "Writing from main" 
    write(*,*) testfunc() 
end program test 

function testfunc() result(y) 
    real    :: y 
    write(*,*) "Write from function g" 
    y=1.0 
    return 
end function testfunc 

當用一個簡單的

gfortran test.f90 

或編譯當包括像Slatec的圖書館

gfortran test.f90 -lslatec 

它工作正常。

但是,將庫更改爲-lblas的-llapack時,在調用testfunc()時程序在運行時掛起 。請注意,我的示例代碼實際上並未使用任何這些庫。我看到的最後一件事是「從主寫入」,然後什麼也沒有發生,我必須CTRL-C重新獲得控制權。掛起時,該過程似乎沒有使用任何CPU週期。

現在很奇怪的是,如果我註釋掉testfunc()中的write語句,它就會一直運行。

所以我的問題是:這些庫真的能阻止我在自己的函數內打印嗎?爲什麼?怎麼樣?

(實際上,我的工作信息在需要LAPACK和BLAS一個更大的計劃,所以我顯然不能僅僅停留鏈接到他們。)

+3

你在做什麼叫做遞歸I/O(執行一個I/O語句,而另一個正在執行)。我不確定標準是否允許使用這種格式,但我相信gfortran會允許它(請參閱gfortran郵件列表上的這個討論:http://gcc.gnu.org/ml/fortran/2008-04/ msg00170.html)。你使用什麼版本的gfortran? – eriktous

回答

6

至於我記得,那是不符合標準的調用遞歸的WRITE關鍵字。

要糾正你的程序,稍微修改主程序

program test  
    implicit none 
    real :: testfunc,result 
    write(*,*) "Writing from main" 
    result=testfunc() 
    write(*,*) result 
end program test 

從我新的起點,你遇到的麻煩也因此無關,與所使用的庫,但錯誤的症狀可能會改變案件(從顯然沒有錯誤到崩潰)。