Fortran Coder

标题: 求帮忙看一下The type of the actual argument differs from the type of th... [打印本页]

作者: fortran菜鸟    时间: 2015-6-5 15:03
标题: 求帮忙看一下The type of the actual argument differs from the type of th...
错误是error #6633: The type of the actual argument differs from the type of the dummy argument.   [S]            



作者: fortran菜鸟    时间: 2015-6-5 15:04
这是第一个子程序:
[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           


作者: fortran菜鸟    时间: 2015-6-5 15:04
以下是错误定位的那一行调用的子程序:
[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  

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

作者: fcode    时间: 2015-6-5 17:17
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 不一致
作者: fortran菜鸟    时间: 2015-6-7 11:22
fortran菜鸟 发表于 2015-6-5 15:04
以下是错误定位的那一行调用的子程序:[mw_shl_code=fortran,true]
SUBROUTINE INVERT (A,NN,N,M,C,DET)    ...

那么应该修改实参呢?还是修改虚参呢?我把两者都声明为integer,这个错误跳过了,出现了其他错误
作者: vvt    时间: 2015-6-7 11:37
这种问题没法回答,只有你自己决定。

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

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

完全取决于你希望它是一个什么类型的变量。必须符合你自己的期望,每一个变量都要有明确的类型,并且实参和虚参的类型需要一致。
作者: fortran菜鸟    时间: 2015-6-7 13:51
vvt 发表于 2015-6-7 11:37
这种问题没法回答,只有你自己决定。

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

嗯,说的有道理,谢谢了 ,我再琢磨琢磨




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