Проблема с операторами if/then, содержащими символьные переменные в Fortran 77

В настоящее время я пытаюсь написать программу на Fortran 77, которая вычисляет количество слов в текстовом файле. Текстовые файлы выглядят так:

Привет мир. Привет мир. Привет мир. Привет мир. Привет мир. Привет мир. Привет мир. Привет мир. Привет мир. Привет мир. Привет мир. Привет мир. Привет мир.

Моя программа сейчас выглядит так:

       program COUNT
       implicit none

       character text*100000
       integer i, a, nw
       nw=1 !number of words                                                     

       open(9, FILE='file.txt', STATUS='old')
       read(9, '(A)') text

       a=0
  10   do i=1, LEN_TRIM(text)
          if (text(i:i) .ne. " ") then
             if (a .eq. 0) then
                goto 10
             else
                a=0
                nw=nw+1
                goto 10
             endif
          else
             if (a .eq. 0) then
                a=a+1
                goto 10
             else
                goto 10
             endif
          endif
       enddo

       print *, "Number of words: ", nw

       end

Я сделал это на бумаге, и это должно работать, однако моя программа застревает в цикле выполнения. Я думаю, что это может иметь какое-то отношение к этому утверждению:

       if (text(i:i) .ne. " ") then

Могу ли я написать логическое выражение таким образом? Если нет, есть ли у кого-нибудь намеки на то, как я могу переписать этот код? Извините, если моя программа немного запутана; Я относительно новичок в этом. Я пытаюсь улучшить свои навыки кодирования, чтобы заниматься вычислительной химией. Большое спасибо за помощь!


person user3164457    schedule 06.01.2014    source источник
comment
Я предлагаю изучить Fortran 95. Кое-что из него вы уже использовали: len_trim. Исходный макет в свободной форме проще в использовании, и язык имеет много дополнительных возможностей. См. en.wikipedia.org/wiki/Fortran_95_language_features.   -  person M. S. B.    schedule 06.01.2014
comment
Вам действительно не нужны никакие из ваших goto 10s. В качестве альтернативы, если вы хотите, чтобы они были, измените их на цикл (что означает переход к следующей итерации).   -  person cup    schedule 06.01.2014
comment
Я не предлагал cycle, потому что это из Fortran 90.   -  person Vladimir F    schedule 06.01.2014
comment
Я думаю, что len_trim - это функция Fortran 77. M. S. B., я согласен с тем, что Fortran 95 проще в использовании, однако мой следующий семестр в классе вычислительного материаловедения основан на Fortran 77. Я бы предпочел программировать на Fortran 95 или C/C++. cup, я удалил второй и третий переходы и заменил первый и последний переходы циклами. Это заставило мою программу работать. Владимир Ф, вы тоже правы, что gotos не нужны, однако я смог исправить программу с помощью цикла. Кайл, я программирую в emacs, поэтому мне не нужно беспокоиться о проблеме со свободной формой, но я считаю, что Fortran 77 позволяет использовать ключевые слова в нижнем регистре.   -  person user3164457    schedule 06.01.2014


Ответы (1)


Все ваши ветки if идут к goto 10, который указывает на начало цикла. Невозможно закончить, потому что это перезапустит цикл с самого начала. Не используйте goto для запуска новой итерации end do , предназначенной для этого.

person Vladimir F    schedule 06.01.2014