2012-04-19 21 views
2

この特定の種類のものは何度も答えられていますが、ここでの質問はctime()または日付/時刻変換よりも一般的なC++のものと関連していると思います。私はちょうどこれでこれを試してみた。だから、ここのコードは次のとおりです。ctime()と日付/時刻変換

#include <iostream> 
#include <ctime> 

using std::cout; 
using std::endl; 
using std::string; 

void strTime(int iM, int iD, int iY) 
{ 
    time_t rwTime; 
    time(&rwTime);   // current epoch time 

    // 1st set:: using tmInfo_11 
    struct tm *tmInfo_11; 
    tmInfo_11 = localtime(&rwTime); 
    tmInfo_11->tm_mon = iM - 1; 
    tmInfo_11->tm_mday = iD; 
    tmInfo_11->tm_year = iY - 1900; 
    mktime(tmInfo_11); 
    cout << "tmInfo_11 RESULt: " << tmInfo_11->tm_wday << endl; 

    // 2nd set:: using tmInfo_22 // 
    struct tm tmInfo_22; 
    tmInfo_22 = *localtime(&rwTime); 
    tmInfo_22.tm_mon = iM - 1; 
    tmInfo_22.tm_mday = iD; 
    tmInfo_22.tm_year = iY - 1900; 
    mktime(&tmInfo_22); 
    cout << "tmInfo_22 RESULt: " << tmInfo_22.tm_wday << endl; 
} 

int main() 
{ 
    int iMM=12, iDD=9, iYY=2009; 
    strTime(iMM, iDD, iYY); 
} 

と、私の質問は:コードのこれら2セット間の違いは何ですか?いずれにせよ、私は同じことを達成することができます。注目すべき違いは、各セットの最初の2行であり、私はそれをすべて理解できなかったことを認めなければならない。だから誰も親切に私にそれを説明できますか?また、投与量1は、他の投与量よりも利点/不利な点がありますか?乾杯!!


私は最後にのコードを使用しましたが、このコードは私に望ましい結果をもたらしました。だから、基本的には、将来の参考のためです: strftime()

#include <iostream> 
#include <fstream> 
#include <ctime> 

using std::cout; 
using std::endl; 
using std::string; 

tm testTime(int iM, int iD, int iY); 

int main() 
{ 
    char tmBuff[20]; 
    int iMM=12, iDD=9, iYY=2009; 

    tm myDate = testTime(iMM, iDD, iYY); 
    strftime(tmBuff, sizeof(tmBuff), "%a, %b %d, %Y", &myDate); 
    cout << "TESt PRINt TIMe: " << tmBuff << endl; 
} 

tm testTime(int iM, int iD, int iY) 
{ 
    time_t rwTime; 

    struct tm tmTime; 
    tmTime = *localtime(&rwTime); 

    tmTime.tm_mon = iM - 1; 
    tmTime.tm_mday = iD; 
    tmTime.tm_year = iY - 1900; 
    mktime(&tmTime); 
    return tmTime; 
} 

それが指定する*localtime(&rwTime)を必要としませんNOTE(tmTimeは後で上書きなっているにもかかわらず)それ以外の年(%Y)がありません作業。助けてくれてありがとう。乾杯!!

+0

最初のチャンクは、localtimeによって割り当てられた構造体で機能します。 2番目のチャンクは、localtimeによって割り当てられた構造体の値が割り当てられたローカル構造体で動作します。しかし、これはとても基本的なように私はあなたの質問を誤解している必要があります。 – HonkyTonk

+0

@HonkyTonk:ありがとう!私はまだいくつかの基本を理解しようとしています。乾杯!! – MacUsers

答えて

1

両方のバージョンが有効なコードですが、私はこの上でいくつかの発言だ:あなたはあなたが所有していないデータ構造に取り組む最初のバージョンで

を。 tmInfo_11は、localtime()によって提供および管理されるメモリを指します。コードが大きくなると、望ましくない副作用が発生する可能性があります。だから私はそれが悪いスタイルだと思うだろう。

2番目のバージョンは良いスタイルですが、データ構造がコピーされるため、おそらく遅くなります。しかし、あなたはそれを本当に、本当に頻繁に実行しなければなりません。

2番目のバージョンでは、明示的に使用しない時間のエントリを除いて、結果を上書きするため、localtime()の呼び出しを省略できると仮定します。最初のバージョンでは、使用するメモリへのポインタが必要なので、localtime()を省略することはできません。

あなたは、2つのバージョンの違いを理解していないと言いました。だから私は、レッスンにポインターについて、またそれらが有効で、良い教科書にない時に再びレッスンすることを勧めます。

+0

説明をありがとう。ちょうどC + +を開始したので、追いつくべきことがたくさんあります。あなたは正しく、 'localtime()'は第2の変種では必要ありません。私はそれを認識しませんでした。しかし、 'void()'を使う代わりに 'curTime'をどうやって返すことができるのですか?' strftime(tmBuff、10、 "%b、%I:%M%p" 、&​​tmInfo_22); '?乾杯!! – MacUsers

+0

@MacUsersバッファ( 'char buffer [11]')を定義し、それを 'strftime'に渡す必要があります。その後、安全に返すことができる 'std :: string t(buffer)'の結果を変換することができます。 'strftime'の戻り値をチェックすることを忘れないでください。また、 'tmInfo_22'はスタック上にあるので、関数が返ってくると無効になることに注意してください。 – bjhend

+0

これは私が今行っていることです: 'char tmBuff [10]; strftime(tmBuff、sizeof(tmBuff)、 "%b、%I:%M%p"、&tmInfo_22); 'これはstrTime()関数内にあります。他の場所、つまりstrTime()の外側でも、必要に応じて異なる 'strftime() '指定子のために同じ方法を実行することをお勧めします。乾杯!! – MacUsers

3

構造体のデータを独自の構造体にコピーしますが、最初はlocaltimeの(静的)構造体へのポインタを使用します。

1

これは、キーである両方のセクションの最初の2行です。 localtime()は静的バッファにその出力を作成し、最初のセクションのようにポインタを作成してから再度呼び出すと、最初のポインタが指しているポインタが上書きされることがあります。

2番目の例は、オブジェクト全体を効率的にコピーしているので、多少改善されていますが、マルチスレッド環境ではこれが破損する可能性があります。

localtime_r()を使用すると、パラメータとしてバッファを渡すことができるので、この問題は発生しません。

+0

このような意味ですか? 'tm tmBuff; struct tm tmInfo = * localtime_r(&rwTime、&tmBuff); '? – MacUsers

+0

はい - 返されるポインタは2番目のパラメータと同じです。あなたの例では、 'tmBuff'と' tmInfo'は同じオブジェクトですが、同じオブジェクトではありません。私は一般に、それを直接利用しない限り、返品を割り当てることに悩まされません。 –

関連する問題