Fortran Coder

标题: 子程序中jian'jie定义的函数在调用时出现错误,被认为实参... [打印本页]

作者: 咔咔皮    时间: 2021-2-2 12:15
标题: 子程序中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.   [FA]    D:\0518Kegangduzhen\sti01\0126\trans1\trans1\Couple-xin.f90    134   







作者: fcode    时间: 2021-2-2 12:59
1. 建议写 implicit none
2. 请找到正确的报错位置。错误在第58行,与 Fp有关,而你给出的代码里,完全没有出现 Fp
作者: 咔咔皮    时间: 2021-2-2 13:24
本帖最后由 咔咔皮 于 2021-2-2 13:25 编辑

不好意思,因为还有另一个对应的子程序,是一样的,粗心描述错了,已经将问题重新修改了,话语中的Fp应该替换为Fa。
作者: 咔咔皮    时间: 2021-2-2 13:25
fcode 发表于 2021-2-2 12:59
1. 建议写 implicit none
2. 请找到正确的报错位置。错误在第58行,与 Fp有关,而你给出的代码里,完全没有 ...

不好意思,因为还有另一个对应的子程序,是一样的,粗心描述错了,已经将问题重新修改了,话语中的Fp应该替换为Fa。,请问您知道应该怎么修改吗
作者: fcode    时间: 2021-2-2 15:07
你在主程序中把 Fa 定义成了外部过程,而Fun2函数的虚参Fa又需要是一个常规变量。
作者: 咔咔皮    时间: 2021-2-2 16:05
不好意思,您能细致的指点下改哪几句吗?  基础很差,这个小问题已经坐着改了几小时没动了,来来回回都改不好,麻烦了

  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*8  Ib,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.   [FA]    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.   [FUN2]        D:\0518Kegangduzhen\sti01\0126\trans1\trans1\Couple-xin.f90        136       

作者: 咔咔皮    时间: 2021-2-2 16:07
fcode 发表于 2021-2-2 15:07
你在主程序中把 Fa 定义成了外部过程,而Fun2函数的虚参Fa又需要是一个常规变量。 ...

不好意思,实在麻烦了,但是请您能帮我看看吗,细节写在回复里了
作者: fcode    时间: 2021-2-2 17:47
在一个程序单元中,一个名字,如果是函数就一直是函数。如果是常规变量,就一直是常规变量。

虚参和实参的类型要相同,要么都是函数,要么都是常规变量。
你需要明确,Fa 和 Fs 分别是什么。

此外,Fortran做不到这样:
传递一个函数名Fa给一个函数sub,让sub函数里给出Fa函数实现,再返回给主程序。
做不到!!!

作者: 咔咔皮    时间: 2021-2-3 11:03
好的谢谢您,我在想办法修改吧,感谢
作者: 咔咔皮    时间: 2021-2-3 11:04
fcode 发表于 2021-2-2 17:47
在一个程序单元中,一个名字,如果是函数就一直是函数。如果是常规变量,就一直是常规变量。

虚参和实参的 ...

好的谢谢您,我在想办法修改吧,感谢




欢迎光临 Fortran Coder (http://bbs.fcode.cn/) Powered by Discuz! X3.2