3

我对 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

1 回答 1

4

您可以将许多子例程和函数放入一个模块的包含部分。您不需要为每个单独的模块。通过为相关过程(子例程和函数)创建模块/文件来组织代码是有意义的。

图书馆是我曾经使用的一个很好的策略。在这个时代,我通常不理会图书馆。编译器太快了,我只用程序需要的模块编译文件。这取决于你的代码有多大。

您使用 call 语句调用子例程。您可以通过在诸如赋值语句之类的表达式中使用函数来调用函数:

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

PS而不是:

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

你有一个函数 ZEROS 来归零你的矩阵吗?该语言将使用分配语句来做到这一点:

IDENTITY = 0.0
于 2012-12-21T07:05:10.950 回答