Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Fortran do循环中出现语法错误的代码编译并给出错误的结果_Fortran - Fatal编程技术网

Fortran do循环中出现语法错误的代码编译并给出错误的结果

Fortran do循环中出现语法错误的代码编译并给出错误的结果,fortran,Fortran,以下是我们称之为test4.F的源代码: do 10 i=1 write(*,*) i 10 continue end 使用gfortran: $gfortran test4.F $./a.out -259911288 使用ifort: $ifort test4.F $./a.out 0 我知道语法不正确。所以两者都会引发编译时错误。您的测试程序确实不是有效的Fortran,但没有语法问题 当文件后缀为.F时,gfortra

以下是我们称之为test4.F的源代码:

     do 10 i=1
        write(*,*) i
10   continue
     end
使用gfortran:

$gfortran test4.F 
$./a.out 
  -259911288
使用ifort:

$ifort test4.F 
$./a.out 
       0

我知道语法不正确。所以两者都会引发编译时错误。

您的测试程序确实不是有效的Fortran,但没有语法问题

当文件后缀为.F时,gfortran和ifort都假定程序使用固定格式源。在固定格式源代码中,语句中的空格在字符上下文之外并不重要。您的程序相当于:

      do10i=1
      write(*,*) i
 10   continue
      end
谨此陈辞:

      do10i=1         ! Set the real variable do10i to value 1
      write(*,*) i    ! Write the undefined integer variable i
 10   continue        ! Do nothing
      end             ! End execution
由于隐式类型,您有一个defaul实数变量do10i,因此do控件没有语法错误,也没有将i设置为1的do控件

相反,您的程序是无效的,因为您引用的是i的值,尽管它不是循环变量,因此尚未首先定义。但这并不是编译器在编译时甚至运行时必须抱怨的错误。编译器可以打印它喜欢的任何值。格夫特兰选择了一个,我选择了另一个


自由使用隐式none和避免固定格式源代码是避免许多编程错误的好方法。在这种情况下,使用end do而不是continue也会提醒编译器您打算出现一些循环。

您的测试程序确实是无效的Fortran,但没有语法问题

当文件后缀为.F时,gfortran和ifort都假定程序使用固定格式源。在固定格式源代码中,语句中的空格在字符上下文之外并不重要。您的程序相当于:

      do10i=1
      write(*,*) i
 10   continue
      end
谨此陈辞:

      do10i=1         ! Set the real variable do10i to value 1
      write(*,*) i    ! Write the undefined integer variable i
 10   continue        ! Do nothing
      end             ! End execution
由于隐式类型,您有一个defaul实数变量do10i,因此do控件没有语法错误,也没有将i设置为1的do控件

相反,您的程序是无效的,因为您引用的是i的值,尽管它不是循环变量,因此尚未首先定义。但这并不是编译器在编译时甚至运行时必须抱怨的错误。编译器可以打印它喜欢的任何值。格夫特兰选择了一个,我选择了另一个


自由使用隐式none和避免固定格式源代码是避免许多编程错误的好方法。在这种情况下,使用end do而不是continue也会提醒编译器您打算出现一些循环。

您使用的是哪个版本的gfortran?对于gfortran-6,以下

      PROGRAM MAIN

      USE ISO_FORTRAN_ENV, ONLY:
     1 COMPILER_VERSION,
     2 COMPILER_OPTIONS

C EXPLICIT TYPING ONLY
      IMPLICIT NONE

C VARIABLE DECLARATIONS
      INTEGER I

      DO 10 I = 1
      WRITE (*,*) I
 10   CONTINUE

      PRINT '(/4A/)',
     1 'THIS FILE WAS COMPILED USING ', COMPILER_VERSION(),
     2 ' USING THE OPTIONS ', COMPILER_OPTIONS()

      END PROGRAM MAIN
确实是犯了错误

main.F:13:13:

       DO 10 I = 1
         1
Error: Symbol ‘do10i’ at (1) has no IMPLICIT type
我怀疑test4.F不包含隐式none语句。因此,DO10I=1被解释为隐式定义的实变量DO10I=1。下面是一个固定格式语句的示例,显示了现在在Fortran 90之后被认为是重要空格的语句,后面是没有空格的等价语句

DO I=1 , M AX ITER S

DO I = 1 , MAXITERS
结果,在所有程序中始终使用显式变量声明。更好的方法是,只使用免费源代码形式main.f90编写Fortran。自由源格式比固定格式更兼容现代交互式输入设备。最大行长度为132个字符,而以前的限制为72个字符。这减少了文本超出限制的可能性,这可能会导致编译器误解名称。这是同样的代码,以自由源代码的形式

program main

  use  ISO_Fortran_env, only: &
       stdout => OUTPUT_UNIT, &
       compiler_version, &
       compiler_options

  ! Explicit typing only
  implicit none

  ! Variable declarations
  integer :: i

  do i = 1, 3
     write (stdout, *) i
  end do

  print '(/4a/)', &
       ' This file was compiled using ', compiler_version(), &
       ' using the options ', compiler_options()

end program main

屈服 1. 2. 三,

 This file was compiled using GCC version 6.1.1 20160802 using the options -mtune=generic -march=x86-64 -std=f2008ts

您使用的是哪个版本的gfortran?对于gfortran-6,以下

      PROGRAM MAIN

      USE ISO_FORTRAN_ENV, ONLY:
     1 COMPILER_VERSION,
     2 COMPILER_OPTIONS

C EXPLICIT TYPING ONLY
      IMPLICIT NONE

C VARIABLE DECLARATIONS
      INTEGER I

      DO 10 I = 1
      WRITE (*,*) I
 10   CONTINUE

      PRINT '(/4A/)',
     1 'THIS FILE WAS COMPILED USING ', COMPILER_VERSION(),
     2 ' USING THE OPTIONS ', COMPILER_OPTIONS()

      END PROGRAM MAIN
确实是犯了错误

main.F:13:13:

       DO 10 I = 1
         1
Error: Symbol ‘do10i’ at (1) has no IMPLICIT type
我怀疑test4.F不包含隐式none语句。因此,DO10I=1被解释为隐式定义的实变量DO10I=1。下面是一个固定格式语句的示例,显示了现在在Fortran 90之后被认为是重要空格的语句,后面是没有空格的等价语句

DO I=1 , M AX ITER S

DO I = 1 , MAXITERS
结果,在所有程序中始终使用显式变量声明。更好的方法是,只使用免费源代码形式main.f90编写Fortran。自由源格式比固定格式更兼容现代交互式输入设备。最大行长度为132个字符,而以前的限制为72个字符。这减少了文本超出限制的可能性,这可能会导致编译器误解名称。这是同样的代码,以自由源代码的形式

program main

  use  ISO_Fortran_env, only: &
       stdout => OUTPUT_UNIT, &
       compiler_version, &
       compiler_options

  ! Explicit typing only
  implicit none

  ! Variable declarations
  integer :: i

  do i = 1, 3
     write (stdout, *) i
  end do

  print '(/4a/)', &
       ' This file was compiled using ', compiler_version(), &
       ' using the options ', compiler_options()

end program main

屈服 1. 2. 三,

 This file was compiled using GCC version 6.1.1 20160802 using the options -mtune=generic -march=x86-64 -std=f2008ts

事实上,所有比Fortran更新的语言都有保留关键字且没有隐式变量声明的原因是发射卫星的软件有一行do31=3.1。这是DO31=3,1的输入错误,但编译器“正确”地”将其解析为声明一个名为DO31的隐式变量。火箭爆炸了,验尸报告确定Fortran的设计是部分原因。@Lorehead反对Fortran隐式键入的论点通常是不公正的;对于这一点,很少有人告诫JavaScript或Python。当FORTRAN 66被标准化时,计算处于初级阶段。最初,它的
目的是执行计算,而不是实现复杂的数据结构。花式计算器不需要提前声明任何内容,因为变量不需要类型。也就是说,值有类型,变量只是附加到值上的名称标记,因此在没有值的情况下,没有什么可以声明变量的类型。@jlokimlin这里的问题是,一个简单的错误很容易产生错误,很难捕捉到错误,因为控制语句的意思变成了意外有效的隐式变量赋值。@Lorehead我完全同意你的看法。每个编写良好的Fortran项目都必须包含隐式none语句的通用实例。隐式none之前有编写良好的项目。事实上,所有比Fortran更新的语言都有保留关键字,并且没有隐式变量声明的原因是,发射卫星的软件有一行do31=3.1。这是DO31=3,1的输入错误,但编译器“正确”地”将其解析为声明一个名为DO31的隐式变量。火箭爆炸了,验尸报告确定Fortran的设计是部分原因。@Lorehead反对Fortran隐式键入的论点通常是不公正的;对于这一点,很少有人告诫JavaScript或Python。当FORTRAN 66被标准化时,计算处于初级阶段。最初,它的目的是执行计算,而不是实现复杂的数据结构。花式计算器不需要提前声明任何内容,因为变量不需要类型。也就是说,值有类型,变量只是附加到值上的名称标记,因此在没有值的情况下,没有什么可以声明变量的类型。@jlokimlin这里的问题是,一个简单的错误很容易产生错误,很难捕捉到错误,因为控制语句的意思变成了意外有效的隐式变量赋值。@Lorehead我完全同意你的看法。每个编写良好的Fortran项目都必须包含隐式none语句的通用实例。隐式none之前有编写良好的项目。是的,缩进是一个错误。修正是的,缩进是一个错误。我认为你的答案是正确的。应该想到这一点。我会等一段时间再接受。我想你的答案是对的。应该想到这一点。我会等一段时间再接受。