Fortran,创建和简化静态库(这里是新手)

Fortran,创建和简化静态库(这里是新手),fortran,static-libraries,Fortran,Static Libraries,我对Fortran有点陌生,但我开始在我反复使用的模块中收集很多函数和子例程。我一直在尝试构建自己的库,以便能够从我编写的新源代码中调用其中的一些函数和子例程。到目前为止,我已经能够让子程序工作,但没有函数。我只是不知道如何从代码中的with调用函数 这里有一个例子。下面的函数接受一个整数并返回单位矩阵 module test contains function IDENTITY(rows) !RETURNS THE IDENTITY MATRIX

我对Fortran有点陌生,但我开始在我反复使用的模块中收集很多函数和子例程。我一直在尝试构建自己的库,以便能够从我编写的新源代码中调用其中的一些函数和子例程。到目前为止,我已经能够让子程序工作,但没有函数。我只是不知道如何从代码中的with调用函数

这里有一个例子。下面的函数接受一个整数并返回单位矩阵

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的路径。但最终,我会有一整节的使用语句。我想避免做所有这些事情,只是把每件事都做得漂亮整洁。有办法吗?任何帮助都会很好


谢谢

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

图书馆是我过去经常使用的一个好策略。在这个时代 我通常不去图书馆。编译器是如此之快,以至于我只需要用程序所需的模块编译文件。这取决于你的代码有多大

使用call语句调用子例程。通过在表达式(如assigment语句)中使用函数来调用函数:

x = sin (y)
matrix = identity (n)
IDENTITY = 0.0
请注意,而不是:

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
你有没有一个函数可以让你的矩阵归零?语言将通过assignment语句来实现这一点:

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