0

time() と localtime() を使用して内部クロックを設定するプログラムがありますが、これを変更して、内部クロックがユーザーや「リアルタイム」時間から独立するようにする必要があります。妥当な開始時刻を設定し、プログラム内部のタイマーに応じて順方向にカウントできるようにする必要があります。これにアプローチする最善の方法についてのアイデアはありますか? 抜粋は次のとおりです。

#define ConvertToBCD(x) ((x / 10) << 4) | (x % 10);
time_t  tm;
time(&tm);
struct tm *tm_local= localtime(&tm);
tm_local->tm_year %= 100;
tm_local->tm_mon++;
timedata[0] = ConvertToBCD(tm_local->tm_year);
timedata[1] = ConvertToBCD(tm_local->tm_mon);
timedata[2] = ConvertToBCD(tm_local->tm_mday);
timedata[3] =  (tm_local->tm_wday + 6) & 7;
if (!(TimeStatus & 0x02)) tm_local->tm_hour %= 12;
timedata[4] = ((tm_local->tm_hour < 12) ? 0x00 : 0x40) | ConvertToBCD(tm_local->tm_hour);
timedata[5] =  ConvertToBCD(tm_local->tm_min);
timedata[6] =  ConvertToBCD(tm_local->tm_sec);
4

3 に答える 3

1

Atime_tは、POSIX 準拠のシステムでは、エポック1970 年 1 月 1 日 0:00:00 からの秒数です。

(負の可能性がある) 値を a に追加しtime_tて時刻を変更し、値がオーバーフローしないことを確認してから、localtime通常どおり使用します。

于 2009-04-12T04:21:48.800 に答える
0

1 秒単位の解像度のみが必要な場合は、time()使用できます。1 秒未満の解像度が必要な場合は、 を使用しますgettimeofday()

ただし、返される値を制御できるようにする場合は、time()(またはgettimeofday()) のサロゲートを自分で定義する必要があります。ほとんどのライブラリは、Plauger のThe Standard C Libraryで説明されている方針に沿って設計されており、多くの場合time()、標準バージョンを置き換えて、必要に応じて動作する関数を提供できます。あるいは、より安全に、コードを修正して、おそらく と呼ばれる独自の考案の関数を呼び出すことができますsimulated_time()。ここで、実稼働作業では(おそらく C99 と C++ の両方でインライン関数を介して) 実数を呼び出すことができますが、それはあなたsimulated_time()time()必要に応じて変更する時間をスケジュールする独自のバージョン。

localtime();の使用を変更する必要はありません。time_t与えた値をstruct tm;に変換するだけです。いつものように答えてほしい。

于 2009-04-12T07:17:39.657 に答える