代码在一台计算机上运行并在另一台计算机上编译(没有警告和编译器错误)但有运行时错误

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 的评论回答了您关于制作过程中有趣的未来主义的问题。