3

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

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

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

谢谢。

4

2 回答 2

2

尝试使用运行时下标检查进行编译。在 Fortran 中,分段错误通常是由下标错误或实际参数和虚拟参数之间的不匹配(即过程调用中的参数与过程中声明的参数之间)引起的。通过查看您的代码,我会做出一个大胆的猜测,即您有一个下标错误——让编译器通过打开运行时下标检查来为您找到它。大多数 Fortran 编译器都将其作为编译选项。

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

于 2012-12-12T00:13:08.603 回答
1

MSB 的答案包含您的问题的要点:您的数组索引在几个地方超出了范围。

在三个循环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正确分配,然后再将其传递给子例程。

于 2012-12-12T22:03:51.577 回答