2015-12-10 39 views
2

當我編譯下面的程序,我有一個錯誤,並在call Coor_Trans命令行線截斷,在參數列表中的語法錯誤

Warning: Line truncated

Error: Syntax error in argument list

我編譯程序多次警告,但它不工作。也許我的通話命令有問題。

program 3D 

     implicit none 
     integer :: i,j,k 
     integer, parameter :: FN=2,FML=5,FMH=5 
     integer, parameter :: NBE=FN*FML*FMH 
     real, parameter :: pi = 4*atan(1.0) 
     real(kind=4), dimension(1:FN,1:FML+1,1:FMH+1) :: BEXL,BEYL,BEZL 
     real(kind=4), dimension(1:FN,1:FML,1:FMH) :: BEXC,BEYC,BEZC,BE2A,BE2B,ANGLE 
     real(kind=4), dimension(1:NBE,1:1,1:1) :: BEXC1,BEYC1,BEZC1,BE2A1,BE2B1,ANGLE1 
     real(kind=4), dimension(1:NBE,1:NBE) :: LOC_PTS1,LOC_PTS2,LOC_PTS3 
     real :: LOC_1,LOC_2,LOC_3 

     do i=1,FN 
     do j=1,FML 
      do k=1,FMH 

      BEXC(i,j,k) = 0.5*(BEXL(i,j,k) + BEXL(i,j+1,k)) 
      BEYC(i,j,k) = 0.5*(BEYL(i,j,k) + BEYL(i,j+1,k)) 
      BEZC(i,j,k) = 0.5*(BEZL(i,j,k) + BEZL(i,j,k+1)) 
      BE2A(i,j,k) = FL(i)/FML + j*0 + k*0 
      BE2B(i,j,k) = FH(i)/FMH + j*0 + k*0 
      ANGLE(i,j,k) = BETA(i) + j*0 + k*0 

      end do 
     end do 
     end do 

     BEXC1 = reshape(BEXC,(/NBE,1,1/)) 
     BEYC1 = reshape(BEYC,(/NBE,1,1/)) 
     BEZC1 = reshape(BEZC,(/NBE,1,1/)) 
     BE2A1 = reshape(BE2A,(/NBE,1,1/)) 
     BE2B1 = reshape(BE2B,(/NBE,1,1/)) 
     ANGLE1 = reshape(ANGLE,(/NBE,1,1/)) 

     do i=1,NBE 
     do j=1,NBE 

      call Coor_Trans(BEXC1(i,1,1),BEYC1(i,1,1),BEZC1(i,1,1),BEXC1(j,1,1),BEYC1(j,1,1),BEZC1(j,1,1),ANGLE1(j,1,1),LOC_1,LOC_2,LOC_3) 
      LOC_PTS1(i,j) = LOC_1 
      LOC_PTS2(i,j) = LOC_2 
      LOC_PTS3(i,j) = LOC_3 

     end do 
     end do 

    end program 3D 

     subroutine Coor_Trans(GLOB_PTSX1,GLOB_PTSY1,GLOB_PTSZ1,GLOB_PTSX2,GLOB_PTSY2,GLOB_PTSZ2,BETA,LOC_PTS1,LOC_PTS2,LOC_PTS3) 

     implicit none 
     real(kind=4), intent(in) :: GLOB_PTSX1,GLOB_PTSY1,GLOB_PTSZ1,GLOB_PTSX2,GLOB_PTSY2,GLOB_PTSZ2,BETA 
     real(kind=4), intent(out) :: LOC_PTS1,LOC_PTS2,LOC_PTS3 
     real, parameter :: pi = 4*atan(1.0) 
     real :: E1,E2 
     E1 = cos(BETA/180*pi) 
     E2 = sin(BETA/180*pi) 
     LOC_PTS1 = (GLOB_PTSX1-GLOB_PTSX2)*E1 + (GLOB_PTSY1-GLOB_PTSY2)*E2 
     LOC_PTS2 = (GLOB_PTSZ1-GLOB_PTSZ2) 
     LOC_PTS3 = -(GLOB_PTSX1-GLOB_PTSX2)*E2 + (GLOB_PTSY1-GLOB_PTSY2)*E1 
     !return 

     end subroutine Coor_Trans 
+0

請務必使用標籤[tag:fortran],否則只有少數人會看到您的帖子。版本(如[tag:fortran95])僅用於指定版本特定問題中的版本,並且僅在主標籤之外使用。 –

+0

感謝您的建議 –

回答

5

call語句的長度太長。一條線的默認最大寬度是。

編譯器將在該寬度處截斷輸入行[就像它那樣 - 並且在警告中這樣說]。之後,您的行號不完整(例如,call foo(a,b錯過了關閉)),從而生成第二條警告消息。

最好的解決辦法就是要打破長行以continuation字符,即&

  call Coor_Trans(BEXC1(i,1,1),BEYC1(i,1,1),BEZC1(i,1,1), & 
          BEXC1(j,1,1),BEYC1(j,1,1),BEZC1(j,1,1), & 
          ANGLE1(j,1,1),LOC_1,LOC_2,LOC_3) 

大多數C-風格指南建議在< = 80個字符保持線。國際海事組織,這是一個很好的做法,即使是Fortran。

請注意,使用GNU fortran,您可以使用-ffree-line-length-<n>命令行選項增加限制。所以,你可以嘗試-ffree-line-length-512,但是,我會做上面的延續

歷史的註腳: 132列是最大寬度高速,鏈條驅動,鏈輪傳動,摺疊紙,行式打印機能打印。

+0

您的回答非常好!謝謝! –

+0

@PythonFun不客氣! Fortran是我1972年學習的第一語言。我在整個70年代使用它,使用80列打孔卡。我在1981年轉向C [並且從不回頭]。那個時代的Fortran [Fortran IV]只是模糊地類似於今天的Fortran。然後,一切都是以列爲導向的。 「C」在第1欄中發表評論。特定列範圍中的行號。從特定列開始的語句。繼續:在第6列中的_next_行放置非「0」字符。請參閱:http://www.math-cs.gordon.edu/courses/cs323/FORTRAN/fortran.html –

3

Fortran標準對編譯器需要處理的行的長度施加了限制,這些日子裏有132個字符。您可以在合適的位置打破線路並使用延續線。事情是這樣的:

call Coor_Trans(BEXC1(i,1,1),BEYC1(i,1,1),BEZC1(i,1,1),BEXC1(j,1,1), & 
    BEYC1(j,1,1),BEZC1(j,1,1),ANGLE1(j,1,1),LOC_1,LOC_2,LOC_3) 

通知的&在不斷行的末尾。

一旦線路被截斷任意它在語法上是錯誤的,這說明你的編譯器的投訴的第二部分。

您的編譯器可能有一個選項來強制它讀取更長的行。