我正在用 FORTRAN 做一个有点特别的程序。我只能使用整数变量,正如您所知,当您尝试计算优于 12 或 13 的阶乘时,您会遇到内存溢出。所以我编写了这个程序来避免这个问题:
http://lendricheolfiles.webs.com/codigo.txt
但是一些非常奇怪的事情正在发生。程序计算阶乘井 4 或 5 次,然后给出内存溢出消息。我正在使用 Windows 8,我担心这可能是失败的原因,或者只是我做错了什么。
谢谢。
尝试使用运行时下标检查进行编译。在 Fortran 中,分段错误通常是由下标错误或实际参数和虚拟参数之间的不匹配(即过程调用中的参数与过程中声明的参数之间)引起的。通过查看您的代码,我会做出一个大胆的猜测,即您有一个下标错误——让编译器通过打开运行时下标检查来为您找到它。大多数 Fortran 编译器都将其作为编译选项。
PS 你也可以通过使用已经编写好的包来进行这样的计算,例如,David Bailey 等人的任意精度算术软件,可在http://crd-legacy.lbl.gov/~dhbailey/mpdist的 Fortran 90 中获得/
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
正确分配,然后再将其传递给子例程。