Search code examples
memoryintegerfortranoverflowfactorial

Calculating factorial on FORTRAN with integer variables. Memory overflow


I'm doing a program with FORTRAN that is a bit special. I can only use integer variables, and as you know with these you've got a memory overflow when you try to calculate a factorial superior to 12 or 13. So I made this program to avoid this problem:

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

But something very strange is happening. The program calculates the factorial well 4 or 5 times and then gives a memory overflow message. I'm using Windows 8 and I fear it might be the cause of the failure, or if it's just that I've done something wrong.

Thanks.


Solution

  • M.S.B.'s answer has the gist of your problem: your array indices go out of bounds at a couple of places.

    In three loops, cifra - 1 == 0 is out of bounds:

    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
    

    In the next case, the value of cifra - (fila - 1) goes out of bounds:

    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
    

    You should be fine if you rewrite the first three loops as do cifra = ncifras, 2, -1 and the inner loop of the other case as do cifra = fila, ncifras. Also, in the example program you posted, you first have to allocate resultado properly before passing it to the subroutine.