用整数变量计算FORTRAN的阶乘。内存溢出

时间:2012-12-11 19:19:34

标签: memory integer fortran overflow factorial

我正在使用FORTRAN做一个有点特殊的程序。我只能使用整数变量,正如你所知,当你尝试计算一个优于12或13的阶乘时,你会发现内存溢出。所以我做了这个程序来避免这个问题:

http://lendricheolfiles.webs.com/codigo.txt

但是发生了一些非常奇怪的事情。程序计算阶乘4或5次,然后给出内存溢出消息。我使用的是Windows 8,我担心它可能是失败的原因,或者只是因为我做错了。

感谢。

2 个答案:

答案 0 :(得分:2)

尝试使用运行时下标检查进行编译。在Fortran中,分段错误通常由下标错误或实际和伪参数之间的不匹配引起(即,在对过程的调用中的参数与过程中声明的参数之间)。我会瞥一眼你的代码,你有一个下标错误 - 让编译器通过打开运行时下标检查找到它。大多数Fortran编译器都将此作为编译选项。

P.S。您也可以使用已编写的软件包进行这样的计算,例如David Bailey等人的任意精度算术软件,可在http://crd-legacy.lbl.gov/~dhbailey/mpdist/的Fortran 90中获得

答案 1 :(得分:1)

M.S.B.的答案有你的问题的要点:你的数组索引在几个地方超出界限。

在三个循环中,cifra - 1 == 0超出范围:

do cifra=ncifras,1,-1
  factor(1,cifra-1) = factor(1,cifra)/10    ! factor is (1:2, 1:ncifras)
  factor(1,cifra) = mod(factor(1,cifra),10)
enddo 
! :
! Same here:
do cifra=ncifras,1,-1
 factor(2,cifra-1) = factor(2,cifra)/10
 factor(2,cifra) = mod(factor(2,cifra),10)
enddo
!:
do cifra=ncifras,1,-1
  sumaprovisional(cifra-1) = sumaprovisional(cifra-1)+(sumaprovisional(cifra)/10)
  sumaprovisional(cifra) = mod(sumaprovisional(cifra),10)
enddo

在下一种情况下,cifra - (fila - 1)的值超出范围:

do fila=1,nfilas
  do cifra=1,ncifras  
    ! Out of bounds for all cifra < fila:
    sumando(fila,cifra-(fila-1)) = factor(1,cifra)*factor(2,ncifras-(fila-1))
  enddo
  sumaprovisional = sumaprovisional+sumando(fila,:)
enddo

如果将前三个循环重写为do cifra = ncifras, 2, -1而将另一个循环的内循环重写为do cifra = fila, ncifras,则应该没问题。此外,在您发布的示例程序中,首先必须正确分配resultado,然后再将其传递给子例程。