2017-01-10 77 views
2

我有一個真實的CURRENTTIME我想將其轉換爲名爲TIMEDIR的字符串。由於TIMEDIR必須改變它的大小,它是可分配的。據我所知,分配工作正常。另外,我檢查了CURRENTTIME有價值。將實數寫入字符串時,輸出爲'*'

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

但是

WRITE(*,*) TIMEDIR 

輸出*,它應該是0CURRENTTIME是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。這個「始終」意味着:無論相應變量的值如何,上述TIMEDIR上述語句的作用是使單個字符非空白。

現在,正如在那個其他答案中,2是實際值輸出的最小場寬度[1]。與所有其他數字輸出格式一樣,如果該字段對於相應的值不夠寬,則該字段完全由* s組成。 F1.0將始終導致輸出*。如果你想輸出0.(或0,[2]你需要F2.0

即將回「的TIMEDIR不同大小」,輸出格式F2.0是(可能)足夠用於小於10的CURRENTTIME非負值,但對於負值或值不小於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

相關問題