Мне нужно, чтобы пользователь вводил только реальные цифры при появлении запроса. Должно отображаться сообщение об ошибке, и программа должна останавливаться, если пользователь вводит символ или любой другой символ. Как я могу сделать это в fortran 77.Проверка входа пользователя Fortran77
ответ
Предполагалось, что вы, вероятно, захотите иметь больше попыток, потому что то, что у вас есть в вашем вопросе, делает компилятор автоматически.
Вы можете использовать спецификаторыили 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
улучшение пользовательского интерфейс немного, я люблю читать строку, а затем выполнить проверку ошибок на внутреннем чтении:
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
Попробуйте свою программу с помощью ввода ', ListDirectedInputCanBeEvil', который обычно не рассматривается как действительный реальный литерал. – IanH
@IanH В каком формате вы предлагаете грациозно обрабатывать случай, когда пользовательские ключи целого? – agentp
Любой цифровой дескриптор редактирования, который может использоваться для реального ввода (F, E, D, G), который имеет .0 как десятичную часть дескриптора, с указанием ширины поля, соответствующей ширине поля ввода, при условии, что интерпретация целостный литерал как реальный - это то, что вы подразумеваете под «изящным». Но если вы действительно хотите проверить, что входной текст соответствует некоторому конкретному шаблону «настоящий литерал», то вы в значительной степени должны сделать это самостоятельно - нет жесткого требования к процессорам Fortran для обнаружения «плохих» входных данных. – IanH
Не используйте список, ориентированный на ввод, если вы беспокоитесь об ошибках. У компиляторов нет никаких обязательств сообщать о «плохих» вводах через iostat. Единственный надежный и портативный способ - это проверить эту проверку самостоятельно. – IanH
Я не могу согласиться. Из одной записи все в порядке. –
Введите косую черту в качестве входного сигнала. Посмотрите, что произойдет. – IanH