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