基本FORTRAN功能错误

时间:2018-06-17 19:20:38

标签: fortran gfortran fortran95

我是Fortran的新手。我面临一个奇怪的问题,我不知道如何解决这个问题。我已粘贴最低工作代码来演示下面的问题。

在代码中,除了cosine函数调用之外,一切都有效。它给出了错误的结果。最奇怪的是如果我取消注释下面的注释行(结果与返回的值没有任何关系),结果会发生变化。

(正如我在几个SO问题中看到的那样,这看起来像是内存访问无效的结果,但无法解决任何问题)

program prog
    implicit none
    double precision, dimension(2) ::  vec1 = (/ 3, 4 /)
    double precision, dimension(2) ::  vec2 = (/ 4, 3 /)

    print *, inner_product(2, vec1, vec2)
    print *, norm(2, vec1)
    print *, cosine(2, vec1, vec2)

contains
    double precision function inner_product(N, V1, V2)
      integer, intent(in) :: N
      double precision, dimension(*), intent(in) :: V1
      double precision, dimension(*), intent(in) :: V2
      integer :: i
      do i = 1, N
          inner_product = inner_product + V1(i)*V2(i)
      end do
    end function inner_product

    double precision function norm(N, V)
      integer, intent(in) :: N
      double precision, dimension(*), intent(in) :: V
      norm = sqrt(inner_product(N, V, V))
    end function norm

    double precision function cosine(N, A, B)
      integer, intent(in) :: N
      double precision, dimension(*), intent(in) :: A
      double precision, dimension(*), intent(in) :: B
      double precision :: na

      ! na = norm(N, A)
      cosine = inner_product(N, A, B) / (norm(N, A) * norm(N, B))
    end function cosine
end program prog

更新:

运行发布的代码会产生以下结果,

   24.000000000000000     
   5.0000000000000000     
  0.67882250993908555 

取消注释当前注释的行后运行程序将提供以下内容,

   24.000000000000000     
   5.0000000000000000     
  0.39191835884530846

它们都不是真的。预期结果为0.96(由24 / (5*5))提供。

1 个答案:

答案 0 :(得分:1)

您的问题是除非优化生效,否则gfortran不会检测到您的错误:

D:\gfortran\clf\uninit>gfortran -O2 uninit.f90 -ouninit

D:\gfortran\clf\uninit>gfortran -Wall uninit.f90 -ouninit
uninit.f90:31:28:

       double precision :: na
                            1
Warning: Unused variable 'na' declared at (1) [-Wunused-variable]

D:\gfortran\clf\uninit>gfortran -O2 -Wall uninit.f90 -ouninit
uninit.f90:31:28:

       double precision :: na
                            1
Warning: Unused variable 'na' declared at (1) [-Wunused-variable]
uninit.f90:17:0:

           inner_product = inner_product + V1(i)*V2(i)

Warning: '__result_inner_product' is used uninitialized in this function [-Wunin
itialized]

这是你想要鼓励gfortran发现的最后一个错误。