2014-05-21 84 views
1

根據current GCC documentation,當我打電話給CTIME時,我應該得到如下格式的日期:「Sat Aug 19 18:13:14 1995」。但是,我運行GCC 4.8.1(MinGW),我得到的輸出是這樣的:「08/19/95 18:13:14」。我實際上有一個我測試過的GCC(0.5)的古老版本,並且在同一臺機器上,該版本正確地格式化輸出。有沒有什麼辦法可以讓CTIME以記錄格式輸出,還是我堅持寫自己的例程來獲得這種格式?我需要這種格式感謝我正在處理的一些遺留代碼。Fortran的CTIME輸出格式

+0

不是你的問題的答案,但你可能會發現https://github.com/milancurcic/datetime-fortran有用。 – milancurcic

回答

3

首先,請將GFortran bug發佈到GCC bugzilla https://gcc.gnu.org/bugzilla。不能保證發佈到stackoverflow的錯誤報告不會在噪音中丟失。 FWIW,我將這個bug提交到https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61310

對於一些背景,GFortran的這種變化是由於努力擺脫線程不安全的C庫函數,如ctime()。 POSIX提供了一個稱爲ctime_r()的線程安全變體,它遇到了許多問題,例如實際上不同的接口(一些商業unix支持基於POSIX標準草案的函數,其中ctime_r具有不同的參數),bug規格說應該足夠了26字節,依此類推。最後,POSIX 2008放棄了ctime_r標記,並建議使用strftime()代替。因此,GFortran遵循這個建議,在測試後發現帶有「%c」說明符的strftime()生成的字符串格式與ctime()相同,只要程序處於默認的「C」語言環境。由於GFortran本身從不設置語言環境(通過調用setlocale),因此這被認爲足夠好。不幸的是,正如你發現的那樣,MSVC libc中的strftime()不會爲%c說明符生成類似ctime()的字符串。無論如何,現在應該修復這個問題,希望這次能夠取得好成績。

在任何情況下,使用標準的date_and_time將比解析ctime的輸出更健壯。

+0

謝謝,我試着定期向GCC bugzilla填充bug,但我的知識不夠好。 –

+0

我對Fortran的能力還不夠自信,無法評估問題是一個錯誤還是僅僅是缺乏理解。感謝您提交錯誤報告以及您的答案。 –

2

從你給的鏈接:

[...]除非應用程序已調用的setlocale,輸出將默認區域,長度爲24和形式的「星期六18年8月19日的: 1995年11月14日'。在其他語言環境中,可能會導致更長的字符串。

因此,輸出取決於您當前的語言環境(並且您的計算機上可能選擇了與編寫文檔的人不同的語言環境)。

+0

是的,我看到了setlocale的提及,但我找不到任何有關操作的信息。你知道我會怎麼做嗎? –

+0

而不是'ctime()'我會使用符合標準的['date_and_time()'](https://gcc.gnu.org/onlinedocs/gfortran/DATE_005fAND_005fTIME.html#DATE_005fAND_005fTIME)。從那裏,你可以建立你自己的(便攜式)時間戳。 –

+0

由於這是我正在處理的遺留代碼,因此與Fortran 77兼容的子程序將更可取。我很想知道setlocale是如何工作的。 –