【问题标题】:Unexpected Statement Function at 1 in FortranFortran 中 1 处的意外语句函数
【发布时间】:2015-05-11 20:20:00
【问题描述】:

我是 Fortran 新手,正在编写这个小程序来为一个圆写出 100 个有序对。

但是我得到了上面提到的错误,我不知道如何解决。

  implicit real*8(a-h,o-z)
  parameter(N=100)
  parameter(pi = 3.14159265358979d0)
  integer*8 k


  dtheta=2*pi/N
  r=1.0d0
  x00=0.0d0
  y00=0.0d0
  do k=0,N-1
   xb(k)=r*cos(k*dtheta)-x00
   yb(k)=r*sin(k*dtheta)-y00
  enddo

  open(64,file='xbyb.m',status='unknown')
  write(64,*) (xb(k),k=0,N-1),(yb(k),k=0,N-1)

  close(64)
  end

【问题讨论】:

    标签: fortran fortran77


    【解决方案1】:

    您没有声明数组xbyb

    虽然在技术上不是 FORTRAN 77,但我仍然建议使用 implicit none 或至少一个等效的编译器选项来强制显式声明所有内容。隐式输入是邪恶的,会导致错误。

    正如高性能标记所提醒的那样,语法

      f(k) = something
    

    声明一个称为语句函数的功能(现在在 Fortran 95 及更高版本中已过时)。它声明一个参数k 的函数。编译器识别您的意思是数组引用的唯一方法是正确声明数组。编译器抱怨语句函数是意外的,因为声明必须放在可执行语句之前。

    write 语句中隐含的 do 循环无论如何都是 Fortran 90,因此在 21 世纪无需坚持使用 FORTRAN 77。

    其他提示: status='unknown' 是多余的,也就是默认的,省略即可。 你可以写r = 1x00 = 0

    【讨论】:

    • 抱歉,我发现 FORTRAN 和这个问题非常有趣......我想我知道编译器很难将 xb 和 yb 引用理解为数组,并认为它们可能是一个古老的特性,称为“声明” FUNCTION” .... 错误消息中剩下的一个谜团是:“为什么 STATEMENT FUNCTION 在 1”出乎意料?我的意思是它显然不是第 1 行?
    • @Travis 那里不能出现语句函数。它必须放在类型和变量声明之后。顺便说一句,近 30 年来它一直被称为 Fortran,而不是 FORTRAN。
    • 我的观察不是关于错误信息的主题,而是位置。消息本身充其量只是模糊了在哪里遇到了问题。 “声明函数在 1 出乎意料”? 'at 1' 是什么意思,为什么编译器认为它在 'at 1' 遇到了这个问题?对于像 FORTRAN 或 Fortran 这样的分析类型语言,如果你坚持的话,我想我希望它更准确,或者至少更具体地说明它遇到的问题。
    • @Travis 这就是所有 gfortran 甚至所有 GCC 错误消息的工作方式。错误消息中引用了一行,下面是数字 1,它标记了该行中的特定列。它的字面意思是“在 1”not“在第 1 行”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    • 2012-08-02
    • 2021-05-02
    • 1970-01-01
    • 1970-01-01
    • 2018-01-09
    相关资源
    最近更新 更多