Fortran Coder

查看: 113|回复: 9

[输入输出] 子程序中jian'jie定义的函数在调用时出现错误,被认为实参...

[复制链接]

10

帖子

2

主题

0

精华

入门

F 币
65 元
贡献
33 点
发表于 2021-2-2 12:15:10 | 显示全部楼层 |阅读模式
本帖最后由 咔咔皮 于 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   






回复

使用道具 举报

1576

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1679 元
贡献
1081 点

美女勋章热心勋章星光勋章新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

发表于 2021-2-2 12:59:25 | 显示全部楼层
1. 建议写 implicit none
2. 请找到正确的报错位置。错误在第58行,与 Fp有关,而你给出的代码里,完全没有出现 Fp

10

帖子

2

主题

0

精华

入门

F 币
65 元
贡献
33 点
 楼主| 发表于 2021-2-2 13:24:04 | 显示全部楼层
本帖最后由 咔咔皮 于 2021-2-2 13:25 编辑

不好意思,因为还有另一个对应的子程序,是一样的,粗心描述错了,已经将问题重新修改了,话语中的Fp应该替换为Fa。

10

帖子

2

主题

0

精华

入门

F 币
65 元
贡献
33 点
 楼主| 发表于 2021-2-2 13:25:07 | 显示全部楼层
fcode 发表于 2021-2-2 12:59
1. 建议写 implicit none
2. 请找到正确的报错位置。错误在第58行,与 Fp有关,而你给出的代码里,完全没有 ...

不好意思,因为还有另一个对应的子程序,是一样的,粗心描述错了,已经将问题重新修改了,话语中的Fp应该替换为Fa。,请问您知道应该怎么修改吗

1576

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1679 元
贡献
1081 点

美女勋章热心勋章星光勋章新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

发表于 2021-2-2 15:07:30 | 显示全部楼层
你在主程序中把 Fa 定义成了外部过程,而Fun2函数的虚参Fa又需要是一个常规变量。

10

帖子

2

主题

0

精华

入门

F 币
65 元
贡献
33 点
 楼主| 发表于 2021-2-2 16:05:51 | 显示全部楼层
不好意思,您能细致的指点下改哪几句吗?  基础很差,这个小问题已经坐着改了几小时没动了,来来回回都改不好,麻烦了

  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       

10

帖子

2

主题

0

精华

入门

F 币
65 元
贡献
33 点
 楼主| 发表于 2021-2-2 16:07:48 | 显示全部楼层
fcode 发表于 2021-2-2 15:07
你在主程序中把 Fa 定义成了外部过程,而Fun2函数的虚参Fa又需要是一个常规变量。 ...

不好意思,实在麻烦了,但是请您能帮我看看吗,细节写在回复里了

1576

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1679 元
贡献
1081 点

美女勋章热心勋章星光勋章新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

发表于 2021-2-2 17:47:21 | 显示全部楼层
在一个程序单元中,一个名字,如果是函数就一直是函数。如果是常规变量,就一直是常规变量。

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

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

10

帖子

2

主题

0

精华

入门

F 币
65 元
贡献
33 点
 楼主| 发表于 2021-2-3 11:03:01 | 显示全部楼层
好的谢谢您,我在想办法修改吧,感谢

10

帖子

2

主题

0

精华

入门

F 币
65 元
贡献
33 点
 楼主| 发表于 2021-2-3 11:04:06 | 显示全部楼层
fcode 发表于 2021-2-2 17:47
在一个程序单元中,一个名字,如果是函数就一直是函数。如果是常规变量,就一直是常规变量。

虚参和实参的 ...

好的谢谢您,我在想办法修改吧,感谢
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

QQ|捐赠本站|Archiver|关于我们 About Us|群聊|Fcode

GMT+8, 2021-3-6 06:47

Powered by Discuz! X3.2

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表