2013-08-02 93 views
-1

最近,我开始瘦Fortran编程。我在YouTube上看到了下面的代码,没有编译错误。但我有一些错误。 我感谢所有帮助意外gfortran编译错误

program 
    implicit none 
    real, parameter :: pi=4*atan(1.0) 
    integer, parameter :: n = 100 
    real :: dimension(1:n) :: x, y 
    real :: a=0.0, b = 2*pi 
    real :: increment 
    integer :: i 

    increment = (b-a)/(real(n)-1) 

    x(1)=0.0 
    do i =2,n 
    x(i) = x(i-1) + increment 
    end do 

    y = sin(x) 

    print *, x(1:5) 
    print *, y(1:5) 

end program 
+4

“一些错误”可以通过“一些解决方案”来解决。更加详细一些。 – DCoder

+0

并具体说明您正在使用哪个版本的gfortran。 –

回答

4

real :: dimension(1:n) :: x, y是一个语法错误。用逗号替换第一个::。您可能需要在程序声明中提供一个名称。本着

1

也有混合型算术

increment = (b-a)/(real(n)-1)

它可能会编译,甚至有可能不会影响程序,但你应该永远,永远不会有任何编程混合模式算术语言,因为它可能会导致奇怪的,很难找到错误。
它应该是这样的:

increment = (b-a)/(real(n)-1.0)

+0

我不认为这是简单常量的问题。编译器将直接进行转换。 –

+5

混合模式算术公由标准定义的,并且不应当是编译器相关的 - 参见2008标准的节7.1.5.1和表7.2。这里附加的详细程度是多余的和'(B-A)/(N-1)'产生预期的结果,因为这两个'A'和'B'是'real'。当然,在这里我假定程序员熟悉混合模式算法的规则。 :) – milancurcic

+0

@ IRO-bot有用的附加信息。 – dwwork

0

这里有哪些地址@High性能标志的关切的工作例子的结果。

host system  = (redacted) 
compiler version = GCC version 5.1.0 
compiler options = -fPIC -mmacosx-version-min=10.9.4 -mtune=core2 -Og -Wall -Wextra -Wconversion -Wpedantic -fmax-errors=5 
execution command = ./a.out 

Compare mesh points 
    1.57017982  1.57080817  1.57143652  
    1.57016802  1.57079625  1.57142460  
Compare function values at these mesh points 
    1622.04211  -84420.7344  -1562.01758  
    1591.57471  13245402.0  -1591.65527  

有在演示一个不好的编程习惯你发现:通过网移动通过添加步骤(+增量),而不是对其计数(K *增量)。这个问题很普遍,并带来严重后果(https://www.ima.umn.edu/~arnold/disasters/patriot.html)。

有关你的代码演示,网格的尺寸提高到了10K点。还示例函数从cos x变为tan x和我们检查在PI/2 = 1.57079633奇异点附近。虽然novitiate可能会发现网格值的差异不重要,但函数值的差异是显着的。

的代码如下所示 -

(13)= 1/8192网误差可以通过使用具有如2 ^(准确的二进制表示的增量减小)。编译命令是gfortran -Wall -Wextra -Wconversion -Og -pedantic -fmax-errors=5 demo.f95。运行命令是./a.out

program demo 
    use iso_fortran_env 
    implicit none 

    real, parameter :: pi = acos (-1.0) 
    integer, parameter :: n = 10001 

    real, dimension (1 : n) :: x, y, z 
    real      :: a = 0.0, b = 2 * pi 
    real      :: increment 

    integer :: k, quarter, status 

    character (len = *), parameter :: c_options = compiler_options() 
    character (len = *), parameter :: c_version = compiler_version() 
    character (len = 255)   :: host = " ", cmd = " " 

!  queries 
     call hostnm  (host, status) 
     call get_command (cmd) 

!  write identifiers 
     write (*, '(/, "host system  = ", g0 )') trim (host) 
     write (*, '( "compiler version = ", g0 )') c_version 
     write (*, '( "compiler options = ", g0 )') trim (c_options) 
     write (*, '( "execution command = ", g0, /)') trim (cmd) 

     increment = (b - a)/(n - 1) 
     quarter = n/4 

!  mesh accumulates errors 
     x (1) = 0.0 
     do k = 2, n 
      x (k) = x (k - 1) + increment 
     end do 
     y = tan (x) 

     print *, 'Compare mesh points' 
     print *, x (quarter : quarter + 2) 

!  better mesh 
     x (1) = 0.0 
     do k = 2, n 
      x (k) = (k - 1) * increment 
     end do 
     z = tan (x) 
     print *, x (quarter : quarter + 2) 

     print *, 'Compare function values at these mesh points' 
     print *, y (quarter : quarter + 2) 
     print *, z (quarter : quarter + 2) 

end program demo