Fortran Coder

查看: 10990|回复: 6
打印 上一主题 下一主题

[子程序] 求帮忙看一下The type of the actual argument differs from the type of th...

[复制链接]

6

帖子

1

主题

0

精华

入门

F 币
43 元
贡献
24 点

规矩勋章

跳转到指定楼层
楼主
发表于 2015-6-5 15:03:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
错误是error #6633: The type of the actual argument differs from the type of the dummy argument.   [S]            


分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩

6

帖子

1

主题

0

精华

入门

F 币
43 元
贡献
24 点

规矩勋章

沙发
 楼主| 发表于 2015-6-5 15:04:20 | 只看该作者
这是第一个子程序:
[Fortran] 纯文本查看 复制代码
SUBROUTINE BMATCH (SM,LAM,A1,A3,S,T,E,V,W,NN,LR,FLOAD,FAMP)       
      IMPLICIT REAL*8 (A-H,O-Z)                                                                                                              
      COMPLEX*16 SM(1),LAM(1),A1(1),A3(1),S(1),T(1),E(NN)               
      COMPLEX*16 V(NN,NN),W(NN,NN),C,CC,D,DD                            
      COMPLEX*16 FLOAD(1),FAMP(1)                                       
      COMMON /LRCHK/ NCOMF                                                                                                                     
      N1=NN-1                                                           
      N2=NN-2                                                           
      N3=NN-3                                                           
      F=.5D0                                                                                                                                  
      DO 30 J=1,NN                                                      
      C=E(J)*(0.0D0,1.0D0)                                              
      DO 30 I=1,NN                                                      
   30 W(I,J)=V(I,J)*C                                                                                                                         
      DO 60 J=1,NN                                                      
      S(1)=A1(1)*W(1,J)+A3(1)*W(3,J)                                    
      S(2)=A1(2)*W(2,J)+A3(2)*W(4,J)                                    
      S(N1)=A1(N1)*W(N1,J)+A3(N3)*W(N3,J)                               
      S(NN)=A1(NN)*W(NN,J)+A3(N2)*W(N2,J)                               
      DO 50 I=3,N2                                                      
   50 S(I)=A3(I-2)*W(I-2,J)+A1(I)*W(I,J)+A3(I)*W(I+2,J)                 
      DO 60 I=1,NN                                                      
   60 W(I,J)=S(I)                                                                                                                             
      CALL INVERT  (V,NN,NN,S,T,DET)      错误定位在这一行,说S的类型不对。                                                                                                     
      DO 80 I=1,NN                                                      
      DO 70 J=I,NN                                                      
      S(J)=(0.0D0,0.0D0)                                                
      DO 70 K=1,NN                                                      
   70 S(J)=S(J)+W(I,K)*V(K,J)                                           
      DO 80 J=I,NN                                                      
   80 W(I,J)=S(J)                                                                                                                             
      CC=(0.0D0,0.0D0)                                                  
      DD=(0.0D0,0.0D0)                                                  
      M=0                                                               
      DO 100 I=2,N2,2                                                   
      K=I-1                                                             
      M=M+1                                                             
      C=F*LAM(M)                                                        
      D=F*SM(M)                                                         
      W(K,I)=W(K,I)+C-CC                                                
      W(K,K+3)=W(K,K+3)-C                                               
      W(I,I+1)=W(I,I+1)-D                                               
      CC=C                                                              
  100 DD=D                                                              
      W(N1,NN)=W(N1,NN)-CC+F*LAM(M+1)                                   
      DO 105 I=1,NN                                                     
      DO 105 J=I,NN                                                     
  105 W(J,I)=W(I,J)                                                                                                                            
      L=0                                                               
      DO 150 J=1,NN                                                     
      DO 150 I=1,J                                                      
      L=L+1                                                             
      V(L,1)=W(I,J)                                                     
  150 W(L,1)=V(L,1)                                                                                                                            
      M=0                                                               
      K=-2                                                              
      DO 200 I=1,NN,2                                                   
      K=K+4                                                             
      L=M+1                                                             
      M=L+K                                                             
      N=L+1                                                             
      DO 180 J=N,M,2                                                    
      IF (NCOMF.EQ.0) GO TO 181                                         
      W(J,1)=-W(J,1)                                                    
      GO TO 180                                                         
181   CONTINUE                                                          
      V(J,1)=-V(J,1)                                                    
180   CONTINUE                                                          
  200 CONTINUE                                                          
      READ (24) (FAMP(LK),LK=1,NN)                                      
      IF (LR-2) 300,400,300                                             
  300 WRITE (23) M, (W(J,1),J=1,M)                                      
      CALL FVECT(NN,FLOAD,W,FAMP)                                       
      IF (LR .EQ. 3) GO TO 400                                          
      RETURN                                                            
  400 WRITE (23) M, (V(J,1),J=1,M)                                      
      CALL FVECT(NN,FLOAD,V,FAMP)                                       
      RETURN                                                            
      END           

6

帖子

1

主题

0

精华

入门

F 币
43 元
贡献
24 点

规矩勋章

板凳
 楼主| 发表于 2015-6-5 15:04:44 | 只看该作者
以下是错误定位的那一行调用的子程序:
[Fortran] 纯文本查看 复制代码
SUBROUTINE INVERT (A,NN,N,M,C,DET)                                
      IMPLICIT REAL*8 (A-H,O-Z)                                                                                                              
      DIMENSION M(1)                                                    
      COMPLEX*16 A(N,1),C(1),D,TEMP,DE                                                                                                        
      DE=(1.0D0,0.0D0)                                                  
      IF (NN-1)  300,350,100                                            
  100 DO 110  I = 1,NN                                                  
  110 M(I) = -I                                                         
      DO 200  I = 1,NN                                                                                                                         
      X=0.0D0                                                           
      DO 130  L = 1,NN                                                  
      IF (M(L).GT.0)  GO TO 130                                         
      DO 120  K = 1,NN                                                  
      IF (M(K).GT.0) GO TO 120                                          
      D=A(L,K)                                                          
      Y=DABS(DREAL(D))+DABS(DIMAG(D))                                   
      IF (X.GT.Y) GO TO 120                                             
      LD = L                                                            
      KD = K                                                            
      X=Y                                                               
  120 CONTINUE                                                          
  130 CONTINUE                                                          
      D=A(LD,KD)                                                        
      DE=DE*D                                                                                                                                 
      L = -M(LD)                                                        
      M(LD) = M(KD)                                                     
      M(KD) = L                                                         
      DO 140  J = 1,NN                                                  
      C(J) = A(LD,J)                                                    
      A(LD,J) = A(KD,J)                                                 
  140 A(KD,J) = C(J)                                                                                                                          
      DO 150  K = 1,NN                                                  
  150 A(K,KD) = A(K,KD)/D                                                                                                                     
      DO 170  J = 1,NN                                                  
      IF (J.EQ.KD)  GO TO 170                                           
      DO 160  K = 1,NN                                                  
  160 A(K,J) = A(K,J) - C(J)*A(K,KD)                                    
  170 CONTINUE                                                                                                                                
      C(KD) =(-1.0D0,0.0D0)                                             
      DO 180  K = 1,NN                                                  
  180 A(KD,K) = -C(K)/D                                                 
  200 CONTINUE                                                                                                                                 
      DO 240  I = 1,NN                                                  
      L = 0                                                             
  220 L = L + 1                                                         
      IF (M(L).NE.I)  GO TO 220                                         
      M(L) = M(I)                                                       
      M(I) = I                                                          
      DO 240  K = 1,NN                                                  
      TEMP = A(K,L)                                                     
      A(K,L) = A(K,I)                                                   
  240 A(K,I) = TEMP                                                     
      DET=CDABS(DE)                                                     
  300 RETURN                                                            
  350 A(1,1) = 1.0D0/A(1,1)                                             
      DET=CDABS(A(1,1))                                                 
      GO TO 300                                                         
      END  

错误中提到的同一个变量  在两个程序中被声明为两种格式,怎么办?

1963

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1357 元
贡献
574 点

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

地板
发表于 2015-6-5 17:17:41 | 只看该作者
CALL INVERT  (V,NN,NN,S,T,DET)      错误定位在这一行,说S的类型不对。
实参 S 被定义为
COMPLEX*16 SM(1),LAM(1),A1(1),A3(1),S(1),T(1),E(NN)

而对应的虚参
SUBROUTINE INVERT (A,NN,N,M,C,DET)      
M 被定义为
DIMENSION M(1)     
默认是整型,而与实参的 complex*16 不一致

6

帖子

1

主题

0

精华

入门

F 币
43 元
贡献
24 点

规矩勋章

5#
 楼主| 发表于 2015-6-7 11:22:34 | 只看该作者
fortran菜鸟 发表于 2015-6-5 15:04
以下是错误定位的那一行调用的子程序:[mw_shl_code=fortran,true]
SUBROUTINE INVERT (A,NN,N,M,C,DET)    ...

那么应该修改实参呢?还是修改虚参呢?我把两者都声明为integer,这个错误跳过了,出现了其他错误

954

帖子

0

主题

0

精华

大师

F 币
184 元
贡献
75 点

规矩勋章元老勋章新人勋章水王勋章热心勋章

QQ
6#
发表于 2015-6-7 11:37:33 | 只看该作者
这种问题没法回答,只有你自己决定。

就好像,你注册帐号时,需要你输入两次密码。这个错误就是告诉你,两次密码不一致。

你说,我是改第一次的密码呢?还是改第二次的密码呢?

完全取决于你希望它是一个什么类型的变量。必须符合你自己的期望,每一个变量都要有明确的类型,并且实参和虚参的类型需要一致。

6

帖子

1

主题

0

精华

入门

F 币
43 元
贡献
24 点

规矩勋章

7#
 楼主| 发表于 2015-6-7 13:51:12 | 只看该作者
vvt 发表于 2015-6-7 11:37
这种问题没法回答,只有你自己决定。

就好像,你注册帐号时,需要你输入两次密码。这个错误就是告诉你,两 ...

嗯,说的有道理,谢谢了 ,我再琢磨琢磨
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2024-5-7 12:39

Powered by Tencent X3.4

© 2013-2024 Tencent

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