2011-10-04 44 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 

从我新的起点,你遇到的麻烦也因此无关,与所使用的库,但错误的症状可能会改变案件(从显然没有错误到崩溃)。