代码在一台计算机上运行并在另一台计算机上编译(没有警告和编译器错误)但有运行时错误
Code works on one computer and compiles (without warning and compiler errors) on another machine but has runtime error
我用 FORTRAN 编写了一个程序,这是一个简单的乘法程序。它似乎在一台计算机上运行良好(编译时没有警告并且输出是正确的),但是当我将文件夹 scp 到另一台计算机时,它在没有警告的情况下编译正常但是,输出更改为随机数,不知道这是为什么?有两个输出,一个是递归算法,另一个是迭代完成的。递归工作正常但迭代给出错误。我已经运行 make clean,我也尝试将文件夹更改为一个新的干净文件夹,仍然是同样的问题。
它运行良好的版本:GNU Fortran (Debian 4.9.2-10) 4.9.2
输出错误的版本:GNU Fortran (Debian 4.4.5-8) 4.4.5
program multiplication
integer(kind = 8) :: multiplier, multiplicand, rcursvmultply, itratvmultply
write(*,*) "multiplier?"
read(*,*) multiplier
write(*,*) "multiplicand?"
read(*,*) multiplicand
write(*,*) rcursvmultply(multiplier, multiplicand)
write(*,*) itratvmultply(multiplier, multiplicand)
end program
recursive function rcursvmultply(multiplier, multiplicand) result(answer)
integer(kind = 8), intent(in) :: multiplier, multiplicand
integer(kind = 8) :: answer
if (multiplier == 0) then
answer = 0
else if (multiplier == 1) then
answer = multiplicand
else if ((multiplier > 1) .and. (mod(multiplier, 2) == 0)) then
answer = rcursvmultply((multiplier/2), (multiplicand*2))
else if ((multiplier > 1) .and. (mod(multiplier, 2) == 1)) then
answer = (multiplicand + (rcursvmultply((multiplier/2), (multiplicand*2))))
end if
end function rcursvmultply
integer(kind = 8) function itratvmultply(multiplier, multiplicand)
integer(kind = 8) :: multiplier, multiplicand
do while (multiplier > 0)
if ((mod(multiplier, 2)) == 1) then
itratvmultply = (multiplicand + itratvmultply)
end if
multiplier = multiplier/2
multiplicand = multiplicand*2
end do
end function itratvmultply
我还在计算机上收到以下警告,提示它无法正常工作:
make: Warning: File `Makefile' has modification time 4.6 s in the future
make: warning: Clock skew detected. Your build may be incomplete.
对于上面的警告,我在原来的电脑上make clean,然后scp,好像没有去掉。但是,当我 make clean 时,它不会在该计算机上再次产生警告。我不确定这是为什么。
当这一行在itratvmultply
itratvmultply = (multiplicand + itratvmultply)
首先执行结果变量(即itratvmultply
)不保证有任何特定值;它没有被明确分配给。这意味着作业的 rhs 实际上是垃圾。
如果在一台计算机上(使用一个版本的编译器和一组(对我们来说)未知的编译选项)编译器将值设置为 0
而在另一台计算机上,则您报告的症状是完全可以解释的(不同的编译器版本,可能不同的选项)没有提供这样的值,变量得到的是恰好是什么位和字节。
您可能认为编译器在程序启动时将变量设置为0
。 Fortran 语言标准不保证这一点。低优化级别的编译器在程序启动时将变量设置为 0
是很常见的,但在较高级别的编译器则不会。
要解决此问题,请添加行
itratvmultply = 0
在变量第一次出现在赋值的 rhs 之前的代码中。并检查您的编译器文档,了解如何让它警告您使用未初始化的变量。
@TriskalJM 的评论回答了您关于制作过程中有趣的未来主义的问题。
我用 FORTRAN 编写了一个程序,这是一个简单的乘法程序。它似乎在一台计算机上运行良好(编译时没有警告并且输出是正确的),但是当我将文件夹 scp 到另一台计算机时,它在没有警告的情况下编译正常但是,输出更改为随机数,不知道这是为什么?有两个输出,一个是递归算法,另一个是迭代完成的。递归工作正常但迭代给出错误。我已经运行 make clean,我也尝试将文件夹更改为一个新的干净文件夹,仍然是同样的问题。
它运行良好的版本:GNU Fortran (Debian 4.9.2-10) 4.9.2
输出错误的版本:GNU Fortran (Debian 4.4.5-8) 4.4.5
program multiplication
integer(kind = 8) :: multiplier, multiplicand, rcursvmultply, itratvmultply
write(*,*) "multiplier?"
read(*,*) multiplier
write(*,*) "multiplicand?"
read(*,*) multiplicand
write(*,*) rcursvmultply(multiplier, multiplicand)
write(*,*) itratvmultply(multiplier, multiplicand)
end program
recursive function rcursvmultply(multiplier, multiplicand) result(answer)
integer(kind = 8), intent(in) :: multiplier, multiplicand
integer(kind = 8) :: answer
if (multiplier == 0) then
answer = 0
else if (multiplier == 1) then
answer = multiplicand
else if ((multiplier > 1) .and. (mod(multiplier, 2) == 0)) then
answer = rcursvmultply((multiplier/2), (multiplicand*2))
else if ((multiplier > 1) .and. (mod(multiplier, 2) == 1)) then
answer = (multiplicand + (rcursvmultply((multiplier/2), (multiplicand*2))))
end if
end function rcursvmultply
integer(kind = 8) function itratvmultply(multiplier, multiplicand)
integer(kind = 8) :: multiplier, multiplicand
do while (multiplier > 0)
if ((mod(multiplier, 2)) == 1) then
itratvmultply = (multiplicand + itratvmultply)
end if
multiplier = multiplier/2
multiplicand = multiplicand*2
end do
end function itratvmultply
我还在计算机上收到以下警告,提示它无法正常工作:
make: Warning: File `Makefile' has modification time 4.6 s in the future
make: warning: Clock skew detected. Your build may be incomplete.
对于上面的警告,我在原来的电脑上make clean,然后scp,好像没有去掉。但是,当我 make clean 时,它不会在该计算机上再次产生警告。我不确定这是为什么。
当这一行在itratvmultply
itratvmultply = (multiplicand + itratvmultply)
首先执行结果变量(即itratvmultply
)不保证有任何特定值;它没有被明确分配给。这意味着作业的 rhs 实际上是垃圾。
如果在一台计算机上(使用一个版本的编译器和一组(对我们来说)未知的编译选项)编译器将值设置为 0
而在另一台计算机上,则您报告的症状是完全可以解释的(不同的编译器版本,可能不同的选项)没有提供这样的值,变量得到的是恰好是什么位和字节。
您可能认为编译器在程序启动时将变量设置为0
。 Fortran 语言标准不保证这一点。低优化级别的编译器在程序启动时将变量设置为 0
是很常见的,但在较高级别的编译器则不会。
要解决此问题,请添加行
itratvmultply = 0
在变量第一次出现在赋值的 rhs 之前的代码中。并检查您的编译器文档,了解如何让它警告您使用未初始化的变量。
@TriskalJM 的评论回答了您关于制作过程中有趣的未来主义的问题。