基本FORTRAN功能错误

问题描述 投票:1回答:1

我是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))给出。

fortran gfortran fortran95
1个回答
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检测到的最后一个错误。

© www.soinside.com 2019 - 2024. All rights reserved.