我正在做一个有点特别的FORTRAN程序。我只能用整型变量,而你也知道这些,你已经有了一个内存溢出,当您尝试计算阶乘优于12或13。所以我做了这个程序来避免这个问题:用整数变量在FORTRAN上计算阶乘。内存溢出
http://lendricheolfiles.webs.com/codigo.txt
但是很奇怪的事情正在发生。程序计算4或5次阶乘,然后发出内存溢出消息。我使用的是Windows 8,我担心这可能是失败的原因,或者只是我做错了什么。
谢谢。
我正在做一个有点特别的FORTRAN程序。我只能用整型变量,而你也知道这些,你已经有了一个内存溢出,当您尝试计算阶乘优于12或13。所以我做了这个程序来避免这个问题:用整数变量在FORTRAN上计算阶乘。内存溢出
http://lendricheolfiles.webs.com/codigo.txt
但是很奇怪的事情正在发生。程序计算4或5次阶乘,然后发出内存溢出消息。我使用的是Windows 8,我担心这可能是失败的原因,或者只是我做错了什么。
谢谢。
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
,然后将其传递给子例程。
尝试使用运行时下标检查进行编译。在Fortran中,段错误通常是由下标错误或实际参数与虚拟参数(即在调用过程的参数与过程中声明的参数之间)之间的不匹配造成的。我会粗略猜测你的代码,你有一个下标错误 - 让编译器通过打开运行时下标检查找到它。大多数Fortran编译器都将此作为编译选项。
P.S.您也可以使用已经编写的软件包进行计算,例如David Bailey等人的任意精度算术软件,可在Fortran 90中找到http://crd-legacy.lbl.gov/~dhbailey/mpdist/
当使用标量integer变量而不是_integer overflow_时,不会得到_memory overflow_。 –
是的,你说得对。我想说当你尝试计算一个高于13的阶乘时,你会得到一个整数溢出,但我得到的是我的程序中的内存溢出。以下是错误:程序接收到的信号SIGSEGV:分段错误 - 无效的存储器引用。 此错误的追踪: #0 6f6a5456 #1 6f69321f #2 004011e9 – Lendrich