基本 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 检测的最后一个错误。
我是 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 检测的最后一个错误。