我最近在向Fortran程序添加函数时学习了tinterface块.一切都很好,整洁,但现在我想在接口块中添加第二个功能.
这是我的界面块:
interface
function correctNeighLabel (A,i,j,k)
integer :: correctNeighLabel
integer, intent(in) :: i,j,k
integer,dimension(:,:,:),intent(inout) :: A
end function
function correctNeighArray (B,d,e,f)
character :: correctNeighArray
integer, intent(in) :: d,e,f
character, dimension(:,:,:),intent(inout) :: B
end function
end interface
Run Code Online (Sandbox Code Playgroud)
在我看来,这可能不是最好的选择.
我已经研究过子程序,但我不太相信它是正确的解决方案.我正在做的是相对简单的,我需要将参数传递给子例程,但我看到的所有子例程都是a)复杂的(即函数太复杂),和b)不接受参数,它们表现得好像他们操纵变量而不将它们传递给它们.
我没有真正正确地研究模块,但从我所看到的不适合使用的模块.
我应该在哪个时候使用,以及如何最好地使用它?
我想计算Fortran 90中两个向量的叉积.例如,在单词中,(1,2,3)和(4,5,6)的叉积结果为(-3,6, -3)在笛卡尔坐标系中.我编写了以下代码(主程序后跟函数定义):
PROGRAM crosstest
IMPLICIT NONE
INTEGER, DIMENSION(3) :: m, n
INTEGER, DIMENSION(3) :: cross
INTEGER, DIMENSION(3) :: r
m=(/1, 2, 3/)
n=(/4, 5, 6/)
r=cross(m,n)
END PROGRAM crosstest
FUNCTION cross(a, b)
INTEGER, DIMENSION(3) :: cross
INTEGER, DIMENSION(3), INTENT(IN) :: a, b
cross(1) = a(2) * b(3) - a(3) * b(2)
cross(2) = a(3) * b(1) - a(1) * b(3)
cross(3) = a(1) * b(2) - a(2) * b(1)
END FUNCTION cross
Run Code Online (Sandbox Code Playgroud)
但是,我收到一条错误消息:
crosstest.f90:10.9:
r=cross(m,n)
1
Error: Rank mismatch …
Run Code Online (Sandbox Code Playgroud) 所以我一直在像瘟疫一样避开Fortran,但最后我的时间到了......我需要参与其他人的Fortran代码(让我们称之为程序A)并用它做两件事:
(1)将其与第三人的Fortran代码合并(让我们称之为程序B),以便B可以调用A
(2)将它与我的C++代码(程序C)合并,以便C可以调用A.
B和C是优化算法,A是基准函数的集合......但在所有可怕的事情发生之前,我必须首先编译我需要的A部分.我需要的所有A子程序都包含在一个文件中.我已根据我上网的信息(例如在代码中添加"IMPLICIT NONE"并使其适合gfortran)进行了整形.但是我有两个顽固的错误和一个警告(我会留下另一个帖子的警告).
这是我目前正在编译它的方式(通过Makefile):
all:
gfortran progA.FOR
g++ -c progC.cpp
g++ -o Program.out progA.o progC.o
rm *.o
Run Code Online (Sandbox Code Playgroud)
但第一行未能完成以下错误,
第一个错误:
SUBROUTINE TP1(MODE)
1
Error: Unclassifiable statement at (1)
Run Code Online (Sandbox Code Playgroud)
相关代码(从文件顶部开始):
IMPLICIT NONE
INTEGER NMAX,MMAX,LMAX,MNNMAX,LWA,LIWA,LACTIV,N,NILI,NINL,
/ NELI,NENL,NEX, MODE
PARAMETER (NMAX = 101,
/ MMAX = 50,
/ LMAX = 50,
/ MNNMAX = NMAX + NMAX + MMAX + 2,
/ LWA = 2*NMAX*NMAX + 33*NMAX + 10*MMAX + 200,
/ LIWA = MMAX + NMAX + 150,
/ LACTIV = …
Run Code Online (Sandbox Code Playgroud)