2012-12-21 51 views
3

我對Fortran有點新,但我開始收集很多功能和子程序,我反覆使用模塊。我一直在嘗試構建自己的庫,以便可以從我編寫的新源代碼中調用其中的一些函數和子例程。到目前爲止,我已經能夠獲得子程序的工作,但不是功能。我只是不知道如何從代碼中調用函數。Fortran,靜態庫創建和簡化(新手在這裏)

下面是一個例子。以下函數接受一個整數並返回標識矩陣。

module test 
contains 
function IDENTITY(rows) !RETURNS THE IDENTITY MATRIX         
    real, dimension(rows,rows) :: IDENTITY           
    integer, intent(in)   :: rows          
    integer      :: i, j                 
    !f2py intent(in) rows                
    !f2py intent(out) IDENTITY               
    !f2py depend(rows) IDENTITY              
    IDENTITY = ZEROS(rows,rows)              
    do i = 1, rows                 
     do j = 1, rows                
      if (i == j) then               
       IDENTITY(i,j) = 1              
      endif                  
     enddo                   
    enddo                    
end function IDENTITY 
end module      

現在我這個編譯成目標文件然後將其歸檔到庫中。然後我寫了一個我想使用這個函數的小程序 - 這是我想避免的問題。我想我必須在我的源代碼中放入\ use \語句,以便它將使用該模塊。然後,我必須在編譯時包含.mod的路徑。但最終,我將會有一整段充滿使用情況的陳述。我想避免做所有這些事情,只是把所有事情做得漂亮整潔。有沒有辦法?任何幫助將是巨大的,

謝謝

回答

4

你可以把許多子程序和功能整合到包含一個模塊的部分。每個人都不需要單獨的模塊。通過爲相關過程(子例程和函數)創建模塊/文件來組織代碼是有意義的。

圖書館是我以前使用的一個很好的策略。在這個時代 我通常不打擾圖書館。編譯器速度如此之快,以至於我只用程序所需的模塊編譯文件。這取決於你的代碼有多大。

您使用調用語句調用子例程。你可以在一個表達式中使用它來調用一個函數:

x = sin (y) 
matrix = identity (n) 

P.S.相反的:

do i = 1, rows 
    do j = 1, rows 
     if (i == j) then 
     IDENTITY(i,j) = 1 
     endif 
    enddo 
enddo 

爲什麼不:

do i = 1, rows 
    IDENTITY(i,i) = 1 
enddo 

你有一個函數零點零你的矩陣?該語言將與一個assigment聲明:

IDENTITY = 0.0