2

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

#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には、他の用量よりも長所/短所がありますか?乾杯!!


完全を期すために、これは私が最終的に作成したコードであり、望ましい結果が得られます。したがって、基本的には将来の参照用です。

#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 )してください(後でtmTimeが上書きされますが)。そうしないと、のYear(%Y)がstrftime()機能しません。助けてくれてありがとう。乾杯!!

4

3 に答える 3

3

tm2番目のバリアントは、構造のデータを独自の構造にコピーしますが、最初のバリアントは、の(静的)構造へのポインターを使用するだけlocaltimeです。

于 2012-04-19T13:59:19.340 に答える
1

重要なのは、両方のセクションの最初の2行です。localtime()静的バッファに出力を作成し、最初のセクションのように、生成されたものへのポインタを取得してから再度呼び出すと、最初のポインタが指しているものが上書きされる場合があります。

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

localtime_r()この問題が発生しないように、バッファをパラメータとして渡すことができるようにすることをお勧めします。

于 2012-04-19T14:00:37.303 に答える
1

どちらのバージョンも有効なコードですが、これについていくつかの意見があります。

最初のバージョンでは、所有していないデータ構造で作業します。tmInfo_11localtime()によって提供および管理されるメモリを指します。これは、コードが大きくなるときに望ましくない副作用を引き起こす可能性があります。だから私はそれを悪いスタイルだと思います。

2番目のバージョンは優れたスタイルですが、データ構造がコピーされるため、実行速度が遅くなる可能性があります。しかし、かなりの違いを確認するには、実際に実行する必要があります。

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

2つのバージョンの違いを理解していないとおっしゃいました。ですから、ポインターについてのレッスンと、ポインターが有効である場合と、良い教科書にない場合について、もう一度レッスンを再検討することをお勧めします。

于 2012-04-19T15:29:09.203 に答える