2014-09-21 1 views
1

Мне нужно, чтобы пользователь вводил только реальные цифры при появлении запроса. Должно отображаться сообщение об ошибке, и программа должна останавливаться, если пользователь вводит символ или любой другой символ. Как я могу сделать это в fortran 77.Проверка входа пользователя Fortran77

ответ

0

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

Вы можете использовать спецификаторыили ERR=.

INTEGER IE 
    DO I = 1, MAX 
    READ(*,*,IOSTAT=IE) X 
    IF (IE.eq.0) GOTO 10 
    PRINT *,"Wrong input, try again." 
    END DO 
10 CONTINUE 

или

GOTO 10 
20 PRINT *,"Wrong input, try again." 
10 READ(*,*,ERR=20) X 
+0

Не используйте список, ориентированный на ввод, если вы беспокоитесь об ошибках. У компиляторов нет никаких обязательств сообщать о «плохих» вводах через iostat. Единственный надежный и портативный способ - это проверить эту проверку самостоятельно. – IanH

+0

Я не могу согласиться. Из одной записи все в порядке. –

+0

Введите косую черту в качестве входного сигнала. Посмотрите, что произойдет. – IanH

0

улучшение пользовательского интерфейс немного, я люблю читать строку, а затем выполнить проверку ошибок на внутреннем чтении:

character insting*80 
    ie=1 
    do while(ie.ne.0) 
    read(*,'(a)')instring 
    if(instring(1:1).eq.'q')stop 
    read(instring,*,iostat=ie)x 
    if(ie.ne.0)then 
     write(*,*)'invalid input ',trim(instring),' is not a real number' 
    endif 
    enddo 

(обратите внимание trim является не f77 btw, но его достаточно легко повторить, если необходимо)

Обратите внимание, что с некоторыми усилиями вы можете обрабатывать патологические случаи. Ведущий «/» или «» не проливает ошибку, но оставляет значение х без изменений (вероятно, система/компилятора зависит, однако!), Так что вы можете сделать что-то вроде этого:

 x=-999999. 
    read(instring,*,iostat=ie)x 
    if(ie.eq.0.and.x.eq.-999999.)then 
      .. code to handle error.. 
    endif 

Вы можете поочередно использовать index к искать плохих персонажей. В моей системе децимал . сам по себе принимается за нуль. Это становится немного громоздким для обработки, но это может быть сделано путем разбора instring

+0

Попробуйте свою программу с помощью ввода ', ListDirectedInputCanBeEvil', который обычно не рассматривается как действительный реальный литерал. – IanH

+0

@IanH В каком формате вы предлагаете грациозно обрабатывать случай, когда пользовательские ключи целого? – agentp

+0

Любой цифровой дескриптор редактирования, который может использоваться для реального ввода (F, E, D, G), который имеет .0 как десятичную часть дескриптора, с указанием ширины поля, соответствующей ширине поля ввода, при условии, что интерпретация целостный литерал как реальный - это то, что вы подразумеваете под «изящным». Но если вы действительно хотите проверить, что входной текст соответствует некоторому конкретному шаблону «настоящий литерал», то вы в значительной степени должны сделать это самостоятельно - нет жесткого требования к процессорам Fortran для обнаружения «плохих» входных данных. – IanH