2017-01-10 5 views
2

У меня есть реальный CURRENTTIME Я хочу преобразовать в строку с именем TIMEDIR. Поскольку TIMEDIR должен изменить размер, он можно выделить. Насколько мне известно, распределение работает нормально. Кроме того, я проверил, что значение CURRENTTIME.Вывод «*» при записи реального в строку

ALLOCATE(CHARACTER(LEN=1)::TIMEDIR) 
WRITE(TIMEDIR, '(F1.0)') CURRENTTIME 

Но

WRITE(*,*) TIMEDIR 

выходы *, где он должен быть 0 (CURRENTTIME является 0,0000000). Я не знаю, в чем проблема.

+0

Вы уверены, что TIMEDIR имеет ценность? – parik

+0

да, он имеет значение «*» ... –

ответ

2

Вы записываете вывод как число с плавающей запятой. Числа с плавающей запятой всегда имеют десятичную точку или показатель степени, чтобы отличать их от целых чисел. Таким образом, самым узким выходом поплавка является 0., то есть 2 символа, а формат F1.0 всегда будет выводить «*», поскольку ширина поля недостаточна для того, что записывается.

+0

Спасибо! Таким образом, я должен выяснить, как сделать «0» из «0.» ... –

+0

<целое число> = INT () – Holmz

1

Ian Bush's answer говорит, что вам нужно знать: вывод для реального значения с использованием дескриптора F требует ширины поля не менее 2. Я немного опишу некоторые другие аспекты.

Вы упоминаете

Как TIMEDIR должен изменить размер это размещаемый

но во фрагменте кода мы видим

WRITE(TIMEDIR, '(F1.0)') CURRENTTIME 

Это предполагает небольшое недоразумение. [Может случиться, что нет путаницы, но я постараюсь понять, что любой другой читатель подходит к этому вопросу.]

Когда выходной формат выглядит как Fw.d для w больше нуля, чем ширина выходного сигнала поле всегдаw. Это «всегда» означает: независимо от значения соответствующей переменной, эффект выражения write выше на TIMEDIR должен содержать один символ без пробела.

Теперь, как и в этом другом ответе, 2 является минимальной шириной поля для вывода действительного значения [1]. Как и при любом другом форматировании с числовым выходом, если поле недостаточно велико для соответствующего значения, поле полностью состоит из * с. F1.0 всегда приведет к выходу *. Если вы хотите получить 0. (или 0,) [2] вам понадобится F2.0.

Возвращаясь к «переменному размеру TIMEDIR», выходной формат F2.0 является (возможно) достаточно для неотрицательных значений CURRENTTIME менее 10, но и для отрицательных значений или значений не менее 10 это не так. Вполне возможно, что здесь находится F0.d. Только в этой форме дескриптор редактирования F определяет, что ширина поля зависит от выходного значения. Это, вероятно, ответ на другой вопрос.

Наконец, как вы упоминаете

Я должен узнать, как сделать «0» из «0»

Я укажу, что вы ищете необходимость в дополнительной логике, например mentioned elsewhere.


и 2 не может быть достаточно, даже для нулевого значения: print '(SP,F2.0)', 0.

Выбор 0. и 0, зависит от десятичного режима: print '(DC,F2.0,DP,F2.0)', 0., 0.

+0

Спасибо за дополнительную информацию. Что же печатает F0.d? Поскольку CURRENTTIME находится между 0 и 3 секундами, мне не нужно было беспокоиться о том, что значение становится больше 10. –

+0

'F0.d' ведет себя так же, как' Fw.d', но вместо ширины 'w' поля - это наименьшая ширина, которая не является большим количеством '*' s. Таким образом, нет ведущих/завершающих пробелов, но с дробными цифрами 'd'. – francescalus

 Смежные вопросы

  • Нет связанных вопросов^_^