2014-05-24 93 views
0

我最近繼承了Fortran代碼,這些代碼曾經是用舊版本的英特爾Visual Fortran編譯器構建的。有一段代碼用於編譯,但現在拋出錯誤#6633'實際參數的類型與僞參數的類型不同。'fortran僞參數與實際參數不匹配。鑄造可用?

問題是,當一個函數調用READ_AND_CONVERT調用與REAL*4DATA_ARRAY(*),但在READ_AND_CONVERT該參數被聲明爲INT*2。我認爲它只是想要DATA_ARRAY的地址。

有沒有辦法通過DATA_ARRAY的地址,即使它們是不同的類型?

這裏是READ_AND_CONVERT

 SUBROUTINE READ_AND_CONVERT (MX, N) 
C======================================================================= 
C  Reads Integer*2 Data Array and Converts it to Real*4. 
C 
C  This is a service routine called by subroutines 
C  READ_XYZ_2, READ_XYZ_4, READ_XYZ_ALL and READ_XYZ_FULL 
C======================================================================= 
C 
     IMPLICIT NONE 
C 
     INCLUDE 'XYZ.FOR' 
     INCLUDE 'COMMON_XYZIO.FOR' 
     INCLUDE 'COMMON_HDR.FOR' 
C 
C----------------------------------------------------------------------- 
C  Local Parameters 
C----------------------------------------------------------------------- 
C 
     LOGICAL BB_FOUND 
     INTEGER*2 MX, MY 
     INTEGER*4 N, J 
     REAL*4  YJ, BB 
C 
     DIMENSION MX(*), MY(2) 
     EQUIVALENCE (YJ, MY(1)) 
C 
C----------------------------------------------------------------------- 
C 
     CALL GET_REAL_PARAMETER ('XYZ$_OFFSET', BB, BB_FOUND) 
C 
     READ (LUGIN) (MX(J), J = 1,N) 
C 
     IF (BB_FOUND) THEN 
     DO J = N, 1, -1 
      YJ  = (SCALE_FACTOR * MX(J)) + BB 
      MX(2*J) = MY(2) 
      MX(2*J-1) = MY(1) 
     END DO 
     ELSE 
     DO J = N, 1, -1 
      YJ  = SCALE_FACTOR * MX(J) 
      MX(2*J) = MY(2) 
      MX(2*J-1) = MY(1) 
     END DO 
     END IF 
C 
     RETURN 
     END 
+0

你真的需要標記你的問題更好地得到一些關注。即使我訂閱[fortran *],我也沒有收到。 [標籤:intel-fortran]只有41位粉絲,[標籤:fortran]有1500位追隨者。 –

回答

0

找到了解決here:通過設置屬性 基本上禁用警告... | Fortran |診斷|檢驗程序接口[變化從有到無]

文章還展示瞭如何做鑄造,在他們的一系列複雜的一個真正的數組的例子:

use ISO_C_BINDING 

complex(8), allocatable :: c(:) 
real(8), pointer:: p(:) 

allocate(c(N)) 
call C_F_POINTER(C_LOC(c), p, [2*N]) 
call donothing(N, p)