子程序中jian'jie定义的函数在调用时出现错误,被认为实参...
本帖最后由 咔咔皮 于 2021-2-2 13:20 编辑各位朋友好,我在这个子程序里 想定义个函数 Fa, Fa是通过函数Nf(1),Nf(2),Nf(3),Nf(4)中任意两个函数相乘间接定义,但是在调用这个子程序时,出现错误 说Fa不能输出一个过程,应该怎么修改呢?
先谢谢看到的朋友了
SUBROUTINE Fun2(X,Fa,BL,m,n)
!**** The Lagrangian function of the plates with angle
IMPLICIT REAL*8(A-Z)
DIMENSION Nf(4)
INTEGER m,n
!m,n=1,2,3,4
Nf(1)=(1.d0-X/BL)*(1.d0-Y/BL)
Nf(2)=(1.d0-X/BL)*( Y/BL)
Nf(3)=( X/BL)*(1.d0-Y/BL)
Nf(4)=( X/BL)*( Y/BL)
Fa=Nf(m)*Nf(n)
END SUBROUTINE Fun2
在主程序中通过 CALL Fun2(X,Fa,BL,1,2) 这个语句调用。
错误 3 error #7112: This actual argument must not be the name of a procedure. D:\0518Kegangduzhen\sti01\0126\trans1\trans1\Couple-xin.f90 134
1. 建议写 implicit none
2. 请找到正确的报错位置。错误在第58行,与 Fp有关,而你给出的代码里,完全没有出现 Fp 本帖最后由 咔咔皮 于 2021-2-2 13:25 编辑
不好意思,因为还有另一个对应的子程序,是一样的,粗心描述错了,已经将问题重新修改了,话语中的Fp应该替换为Fa。 fcode 发表于 2021-2-2 12:59
1. 建议写 implicit none
2. 请找到正确的报错位置。错误在第58行,与 Fp有关,而你给出的代码里,完全没有 ...
不好意思,因为还有另一个对应的子程序,是一样的,粗心描述错了,已经将问题重新修改了,话语中的Fp应该替换为Fa。,请问您知道应该怎么修改吗 你在主程序中把 Fa 定义成了外部过程,而Fun2函数的虚参Fa又需要是一个常规变量。 不好意思,您能细致的指点下改哪几句吗?基础很差,这个小问题已经坐着改了几小时没动了,来来回回都改不好,麻烦了
SUBROUTINE STIF_J(r11,r22,t12,t21,E01,E02,h01,h02,p01,p02,BL,m,n,STIFJ)
IMPLICIT REAL*8(A-H,O-Z)
DIMENSION STIFJ(2,2),Tao(2,2),T1(2,2),T2(2,2),T2I(2,2)
REAL*8Ib,Jinte,Jintea,Jintea_0
EXTERNAL FS,Fp,Fa
……
……
CALL FS(X,Y1,Y2)
CALL Fun2(X,Y,Fa,BL,m,n)
CALL FSIM2(0.d0,BL,FS,Fa,0.0001,Jintea_0)
Jintea=2*Jintea_0
STIFJ(1,1)=STIFJ(1,1)+(T1(1,1)*T2I(1,1)+T1(1,2)*T2I(2,1))*Cg1*Jintea
STIFJ(1,2)=STIFJ(1,2)+(T1(1,1)*T2I(1,2)+T1(1,2)*T2I(2,2))*Cg2*Jintea
STIFJ(2,1)=STIFJ(2,1)+(T1(1,1)*T2I(1,1)+T1(2,2)*T2I(2,1))*Cg1*Jintea
STIFJ(2,2)=STIFJ(2,2)+(T1(2,1)*T2I(1,2)+T1(2,2)*T2I(2,2))*Cg2*Jintea
END
$$
SUBROUTINE Fun2(X,Y,Fa,BL,m,n)
!**** The Lagrangian function of the plates with angle
IMPLICIT REAL*8(A-Z)
DIMENSION Nf(4)
INTEGER m,n
! m,n=1,2,3,4
Nf(1)=(1.d0-X/BL)*(1.d0-Y/BL)
Nf(2)=(1.d0-X/BL)*( Y/BL)
Nf(3)=( X/BL)*(1.d0-Y/BL)
Nf(4)=( X/BL)*( Y/BL)
Fa=Nf(m)*Nf(n)
END
这个子程序中我是想把Fa作为函数输出的:'(
$$
SUBROUTINE FS(X,Y1,Y2)
IMPLICIT REAL*8(A-Z)
Y1=0
Y2=X
RETURN
END
错误 3 error #7112: This actual argument must not be the name of a procedure. D:\0518Kegangduzhen\sti01\0126\trans1\trans1\Couple-xin.f90 134
我把 CALL FSIM2(0.d0,BL,FS,Fa,0.0001,Jintea_0) 中的Fa变为Fun2,外部声明也改成Fun2后又出现下边的问题
而且改成这样后和FS明明差不多,为什么FS 就没出问题,这个就怎么也不对
错误 3 error #7071: The classification of the associated actual procedure differs from the classification of the dummy procedure; i.e., one is subroutine and one is function. D:\0518Kegangduzhen\sti01\0126\trans1\trans1\Couple-xin.f90 136
fcode 发表于 2021-2-2 15:07
你在主程序中把 Fa 定义成了外部过程,而Fun2函数的虚参Fa又需要是一个常规变量。 ...
不好意思,实在麻烦了,但是请您能帮我看看吗,细节写在回复里了:-hug: 在一个程序单元中,一个名字,如果是函数就一直是函数。如果是常规变量,就一直是常规变量。
虚参和实参的类型要相同,要么都是函数,要么都是常规变量。
你需要明确,Fa 和 Fs 分别是什么。
此外,Fortran做不到这样:
传递一个函数名Fa给一个函数sub,让sub函数里给出Fa函数的实现,再返回给主程序。
做不到!!!
好的谢谢您,我在想办法修改吧,感谢:-handshake fcode 发表于 2021-2-2 17:47
在一个程序单元中,一个名字,如果是函数就一直是函数。如果是常规变量,就一直是常规变量。
虚参和实参的 ...
好的谢谢您,我在想办法修改吧,感谢:-handshake
页:
[1]