Бесконечная проблема с циклом выполнения

#fortran #gfortran

Вопрос:

Просто чтобы предварить этот вопрос, я пару недель новичок в Fortran, и я столкнулся с бесконечной ошибкой цикла выполнения при запуске реальной программы.

Я на 99% уверен, что бесконечная последовательность исходит из цикла do, но я подумал, что должен спросить просто для уверенности. Я не уверен, какая часть цикла do вызывает бесконечный цикл do, но любая помощь была бы очень признательна!

Вот код:

 implicit none
   
   ! Declare variables - Add variables as necessary (integer only!)
   ! M will store the encoding matrix, MInv will store its inverse
   ! Decoded_message will store the decoded message
   integer :: M(2,2), MInv(2,2), Determinant, a, b, c, d, detM, i, v(:,:), ascIIcode(:,:)
   allocatable :: v, ascIIcode
   character*32 :: Decoded_Message
   
   ! open data file and read in the encoding matrix
   open(42,file='Data3.txt')
   
   read(42,*) M(1,1), M(1,2)
   read(42,*) M(2,1), M(2,2)
   
   ! Invert the encoding matrix and store it in MInv

   detM  = determinant(M)

   MInv(1,1) =  detM *M(2,2)
   MInv(1,2) = -detM *M(2,1)
   MInv(2,1) = -detM *M(1,2)
   MInv(2,2) =  detM *M(1,1)
   
   
   ! Processing steps required:
       
   ! Read from the file in 2 numbers at a time and store in a vector array
       
       
       
       do i = 2, 31
       
       allocate (v(2,1), ascIIcode(2,1))
       
       read(42,*) v(1,1)
       read(42,*) v(2,1)
       
   ! decode the 2 numbers read in (1) by multiplying Minv by the vector array from (1)
       
       ascIIcode(1,1) = ((MInv(1,1)*v(1,1)) (MInv(1,2)*v(2,1)))
       ascIIcode(2,1) = ((MInv(2,1)*v(1,1)) (MInv(2,2)*v(2,1)))
       
   ! Insert the result from (2) into the character string Decoded_Message. To concatinate 
       
      Decoded_Message = char(ascIIcode(1,1))//char(ascIIcode(2,1))

   ! Use a loop that advances in steps of 2 and goes to 31 
       
       deallocate (v)
       deallocate (ascIIcode)
       
       end do 
       
   ! print results.
       
   print*, Decoded_Message
   
   ! close files
   close(42)

end program Decode


integer function Determinant(M)

   ! This function computes the determinant of matices of size 2 or 3
   ! M is the matrix for which the determinant is calculated (square matrix only)
   ! n is the number of rows or columns in M  

    implicit none
    
    integer :: M(2,2), a, b, c, d, e, f, g, h, i, Det
    
    do
    
    a = M(1,1)
    b = M(1,2)
    c = M(2,1)
    d = M(2,2)
    
    Det = (a*d)-(b*c)
    
    end do

end function Determinant
 

Комментарии:

1. Если вы хотите диагностировать, почему программа зависает, вы можете либо использовать отладчик, либо ввести print инструкции, чтобы увидеть, что происходит.

2. Вы, кажется, знаете, что DOs предназначены для зацикливания (а не просто для команды «сделайте следующее»), поэтому не могли бы вы объяснить, что, по вашему мнению do; ...; end do determinant , означает in? (Однострочная форма, используемая для комментария, на самом деле растянута на несколько строк без точки с запятой.) Это ваш бесконечный цикл, но я изо всех сил пытаюсь понять, почему вы думаете, что это что-то другое.

3. Ни один из ваших циклов (цикл do i=2,31 в основной программе и бесконечный цикл do в функции Determinant ), по-видимому, не служит какой-либо цели. Вы не используете индекс i , поэтому цикл в основной программе просто пытается сделать то же самое 30 несколько раз. А затем цикл Determinant просто вычисляет один и тот же определитель снова и снова, бесконечное количество раз.

4. Если я полностью удалю цикл do в функции определителя, разве это не должно решить проблему? @франческалус

5. Если вы удалите do и end do из функции (и, как предполагает veryreverie, цикл в основной программе также «бесполезен»), это действительно решит вашу проблему бесконечного цикла. Однако я не могу прокомментировать, есть ли у вас какие-либо другие проблемы.