#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. Если вы хотите диагностировать, почему программа зависает, вы можете либо использовать отладчик, либо ввести
2. Вы, кажется, знаете, что DOs предназначены для зацикливания (а не просто для команды «сделайте следующее»), поэтому не могли бы вы объяснить, что, по вашему мнению
do; ...; end do
determinant
, означает in? (Однострочная форма, используемая для комментария, на самом деле растянута на несколько строк без точки с запятой.) Это ваш бесконечный цикл, но я изо всех сил пытаюсь понять, почему вы думаете, что это что-то другое.3. Ни один из ваших циклов (цикл
do i=2,31
в основной программе и бесконечный циклdo
в функцииDeterminant
), по-видимому, не служит какой-либо цели. Вы не используете индексi
, поэтому цикл в основной программе просто пытается сделать то же самое30
несколько раз. А затем циклDeterminant
просто вычисляет один и тот же определитель снова и снова, бесконечное количество раз.4. Если я полностью удалю цикл do в функции определителя, разве это не должно решить проблему? @франческалус
5. Если вы удалите
do
иend do
из функции (и, как предполагает veryreverie, цикл в основной программе также «бесполезен»), это действительно решит вашу проблему бесконечного цикла. Однако я не могу прокомментировать, есть ли у вас какие-либо другие проблемы.