【问题标题】:Line truncated, Syntax error in argument list行被截断,参数列表中的语法错误
【发布时间】:2016-03-15 15:46:52
【问题描述】:

当我编译下面的程序时,我在call Coor_Trans命令行中出现错误和警告

警告:行被截断

错误:参数列表中的语法错误

我编译了好几次程序,但是还是不行。可能我的调用命令有问题。

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

【问题讨论】:

  • 始终使用标签fortran,否则只有少数人会看到您的帖子。版本(如fortran95)仅用于在版本特定问题中指定版本,并且仅在主标签之外使用。
  • 感谢您的建议

标签: fortran call subroutine fortran95


【解决方案1】:

您的call 语句的长度 太长。线条的默认最大宽度为 132

编译器将截断该宽度的输入行[就像它所做的那样——并在警告中这么说]。之后,您有一条不完整的行(例如,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 风格指南建议将行保持在

注意,对于 GNU fortran,您可以使用 -ffree-line-length-<n> 命令行选项来增加限制。所以,你可以试试-ffree-line-length-512,但是,我会继续上面的操作

历史脚注: 132 列是高速、链条驱动、链轮进给、折叠纸、行式打印机可以打印的最大宽度。

【讨论】:

  • 你的回答太棒了!谢谢!
  • @PythonFun 不客气! Fortran 是我在 1972 年学习的第一种语言。在整个 1970 年代,我使用 80 列穿孔卡片使用它。我在 1981 年切换到 C [从未回头]。那个时代的 Fortran [Fortran IV] 只是模糊地类似于今天的 Fortran。然后,一切都是面向列的。第 1 列中的“C”用于评论。特定列范围内的行号。从特定列开始的语句。继续:在第 6 列的 next 行放置一个非“0”字符。参见:math-cs.gordon.edu/courses/cs323/FORTRAN/fortran.html
【解决方案2】:

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)

注意续行末尾的&

一旦该行被任意截断,它在语法上就是错误的,这解释了编译器抱怨的第二部分。

您的编译器可能有一个选项可以强制它读取更长的行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-27
    相关资源
    最近更新 更多