基本 FORTRAN 函数错误

Basic FORTRAN function error

我是 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

None 其中为真。预期结果是 0.96(由 24 / (5*5)).

给出

你的问题是除非优化生效,否则 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 检测的最后一个错误。