2015-04-11 2 views
4

Я хотел использовать автоматический описатель целого ширина в Фортране 90. Я называюсь Output formatting: too much whitespace in gfortran Этого вопрос говорит, что я могу использовать I0 и F0,0 для «авто» ширины. Вот мой пример кода (выполнил GNU Fortran Compiler):Автоматической ширина целочисленного дескриптора в Fortran 90

PROGRAM MAIN 
IMPLICIT NONE 

INTEGER :: i 
REAL :: j 

WRITE (*,*) 'Enter integer' 
READ (*,100) i 
100 FORMAT (I0) 

WRITE (*,*) 'Enter real' 
READ (*,110) j 
110 FORMAT (F0.0) 

WRITE (*,100) 'Integer = ',i 
WRITE (*,110) 'Real = ',j 

END PROGRAM 

Существует ошибка времени выполнения (unit = 5, file = 'stdin') Fortran runtime error: Positive width required in format

Am I неправильно понимать дескриптор авто ширины? Какой вариант использовать?

+0

просто сделать список направлен ввод/вывод на чтение (' read (*, *) ') – agentp

+0

Я был разорван между предложением http://stackoverflow.com/q/21170031 в качестве дубликата и ответа. В конце концов, я думал, что ясное утверждение о том, что «нет« I0 »на входе» на сфокусированный вопрос было разумным. – francescalus

ответ

4

Использование I0 для указания минимальной ширины поля разрешено для вывода. Для ввода I0 не допускается.

От Fortran 2008, 10.7.2.1 (6) (курсив мой):

На выходе, с I, В, О, Z, F, G и редактирование, заданное значение ширины поля w может быть нулем. В таких случаях процессор выбирает наименьшую положительную фактическую ширину поля, которая не приводит к заполнению поля звездочками. Указанное значение w не должно быть равно нулю на входе.

Там нет четкой альтернативы I0 для ввода, но agentp комментариев, список направленного ввода (read(*,*)) прост и вполне может быть подходим для ваших нужд. Если это не так, вы можете изучить более общий синтаксический анализ строк, считанных в качестве символьных переменных. Вы можете использовать find.

+0

Я понял, что 'read (*, *)' следует использовать. Но что при чтении матрицы (скажем, 5x5) из файла? Первая строка будет иметь 5 действительных чисел с различной шириной. Есть ли у вас какие-либо предложения по чтению такого файла? – user3705273

+0

Если вы хотите прочитать пять действительных чисел со списком, введя только список пяти переменных в списке ввода: 'read (*, *) a (1,1: 5)', скажем. То же самое и с использованием явного формата или списка. Разница заключается в том, что управление списками обрабатывает различную ширину. – francescalus

0

В дополнение к ответам @francescalus и @agentp, имейте в виду, что метки формата, например. 100 FORMAT (I0) следует избегать.

Вместо этого просто укажите format в пределах read, например. если вы хотите прочитать целое число шириной до 8 символов, READ(*,'(I8)') i.

Если у вас есть очень длинный формат или формат, который вы повторно использовать в нескольких строках коды, сохраните его в символьной строке:

character :: form*64 
real  :: r1, r2 

form = '(es13.6)' ! e.g. 9.123456e+001 

. 
. 
. 

WRITE (*,*) 'Enter a number' 
READ (*, form) r1 
WRITE (*,*) 'Enter another number' 
READ (*, form) r2 
Смежные вопросы