2012-12-11 46 views
2

我正在做一个有点特别的FORTRAN程序。我只能用整型变量,而你也知道这些,你已经有了一个内存溢出,当您尝试计算阶乘优于12或13。所以我做了这个程序来避免这个问题:用整数变量在FORTRAN上计算阶乘。内存溢出

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

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

谢谢。

+1

当使用标量integer变量而不是_integer overflow_时,不会得到_memory overflow_。 –

+0

是的,你说得对。我想说当你尝试计算一个高于13的阶乘时,你会得到一个整数溢出,但我得到的是我的程序中的内存溢出。以下是错误:程序接收到的信号SIGSEGV:分段错误 - 无效的存储器引用。 此错误的追踪: #0 6f6a5456 #1 6f69321f #2 004011e9 – Lendrich

回答

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,然后将其传递给子例程。

2

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

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