使用FORTRAN计算整数变量的阶乘。内存溢出。

3
我正在用FORTRAN编写一个有些特殊的程序。我只能使用整数变量,如你所知,当你试图计算大于12或13的阶乘时,就会出现内存溢出的问题。因此,我制作了这个程序来避免这个问题: http://lendricheolfiles.webs.com/codigo.txt 但是出现了一些非常奇怪的问题。该程序可以正确计算4或5次阶乘,然后就出现了内存溢出的消息。我正在使用Windows 8,我担心它可能是故障的原因,或者是我做错了什么。
谢谢。

1
使用标量 integer 变量时,不会出现 _memory overflow_,而是会出现 _integer overflow_。 - Hristo Iliev
是的,你说得对,抱歉。我想说的是,当你尝试计算一个大于13的阶乘时,会发生整数溢出,但我在我的程序中得到的是内存溢出。这是错误信息:程序收到信号SIGSEGV:分段错误-无效的内存引用。此错误的回溯: #0 6f6a5456 #1 6f69321f #2 004011e9 - Lendrich
2个回答

2
尝试使用运行时下标检查进行编译。在Fortran中,分段错误通常是由下标错误或实参与虚参之间不匹配(即过程调用中的实参和过程声明中声明的实参之间的参数)所致。从您的代码中粗略推测,您可能存在下标错误,通过启用运行时下标检查,可以让编译器为您找出错误。大多数Fortran编译器都提供这个选项作为编译选项。
P.S. 您还可以使用已编写的软件包(例如David Bailey等人的任意精度算术软件),以Fortran 90为例,请访问http://crd-legacy.lbl.gov/~dhbailey/mpdist/来执行此类计算。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接