我正在使用FORTRAN做一个有点特殊的程序。我只能使用整数变量,正如你所知,当你尝试计算一个优于12或13的阶乘时,你会发现内存溢出。所以我做了这个程序来避免这个问题:
http://lendricheolfiles.webs.com/codigo.txt
但是发生了一些非常奇怪的事情。程序计算阶乘4或5次,然后给出内存溢出消息。我使用的是Windows 8,我担心它可能是失败的原因,或者只是因为我做错了。
感谢。
答案 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
,然后再将其传递给子例程。