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

Memory 使用整数变量在FORTRAN上计算阶乘。内存溢出,memory,integer,fortran,overflow,factorial,Memory,Integer,Fortran,Overflow,Factorial,我正在用FORTRAN编写一个有点特别的程序。我只能使用整数变量,正如你所知道的,当你试图计算一个高于12或13的阶乘时,你会有内存溢出。所以我做了这个程序来避免这个问题: 但是发生了一些非常奇怪的事情。程序计算阶乘井4或5次,然后给出内存溢出消息。我使用的是Windows8,我担心这可能是失败的原因,或者只是我做错了什么 谢谢。尝试使用运行时下标检查进行编译。在Fortran中,分段错误通常由下标错误或实际参数与伪参数之间的不匹配(即,过程调用中的参数与过程中声明的参数之间的不匹配)引起。通

我正在用FORTRAN编写一个有点特别的程序。我只能使用整数变量,正如你所知道的,当你试图计算一个高于12或13的阶乘时,你会有内存溢出。所以我做了这个程序来避免这个问题:

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


谢谢。

尝试使用运行时下标检查进行编译。在Fortran中,分段错误通常由下标错误或实际参数与伪参数之间的不匹配(即,过程调用中的参数与过程中声明的参数之间的不匹配)引起。通过浏览代码,我可以猜测您有一个下标错误——让编译器通过打开运行时下标检查来为您找到它。大多数Fortran编译器都将此作为编译选项


另外,您也可以使用已经编写好的软件包进行类似的计算,例如,David Bailey等人的任意精度算术软件,可在Fortran 90中获得,网址为

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
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
在下一种情况下,
cifra-(fila-1)
的值超出范围:

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
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 fila=1,nfila
do cifra=1,NCIFRA
! 所有cifra

如果您将前三个循环重写为
do-cifra=ncifras,2,-1
,将另一个案例的内部循环重写为
do-cifra=fila,ncifras
,则应该可以。此外,在您发布的示例程序中,在将其传递给子例程之前,您首先必须正确分配
resultado

使用标量
整型变量时,不会出现内存溢出,而是出现整型溢出。是的,对不起。我想说的是,当你试图计算一个高于13的阶乘时,你会得到一个整数溢出,但我得到的是程序中的内存溢出。错误如下:程序接收信号SIGSEGV:分段错误-内存引用无效。此错误的回溯跟踪:#0 6f6a5456#1 6f69321f#2 004011e9