我对Fortran有些新意,但是我开始在模块中收集很多函数和子例程,我一遍又一遍地使用它们。我一直在尝试构建自己的库,以便我可以从我编写的新源代码中调用其中的一些函数和子例程。到目前为止,我已经能够使子程序工作,但不是功能。我只是不知道如何在代码中调用函数。
这是一个例子。以下函数接受整数并返回Identity矩阵。
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的路径。但最终,我将会有一整段使用语句。我想避免做所有这些事情,只是让一切都好看又整洁。有办法吗?任何帮助都会很棒,
谢谢
答案 0 :(得分:4)
您可以将许多子例程和函数放入一个模块的contains部分。每个都不需要单独的模块。通过为相关过程(子例程和函数)创建模块/文件来组织代码是有意义的。
我以前使用的库是一个很好的策略。在这个时代 我通常不打扰图书馆。编译器非常快,我只是用程序所需的模块编译文件。这取决于你的代码有多大。
使用call语句调用子例程。您可以在表达式中使用它来调用函数,例如assigment语句:
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
你有一个ZEROS函数将你的矩阵归零吗?该语言将使用一个声明语句来做到这一点:
IDENTITY = 0.0