2016-04-23 6 views
1

私は2つの変数(時間変数の一種)を入力して、その差を計算できる必要があります。 私の検索結果がすべてdifftimeだったのですが、私の問題はそれがtime_tという変数を使用していて、私が望む時間を 'time_t'に書き込む方法がわかりません。 たとえば、ユーザーはtime_1とtime_2を(10:04、11:05)と入力して、秒や分、時などの違いを表示できます(たとえば61分)2人のユーザーの入力時刻の違いC++

打撃が、それは働いていませんでした:

#include <iostream> 
#include <ctime> 
using namespace std; 
void main() 
{ 
    tm time_1 = {0, 0, 0, 1, 0, 0, 0, 0, 0}; 
    tm time_2 = {0, 0, 0, 1, 0, 0, 0, 0, 0}; 

    time_1.tm_hour = 10; 
    time_1.tm_min = 4; 

    time_2.tm_hour = 11; 
    time_2.tm_min = 5; 

    double diff = difftime (mktime(&time_2),mktime(&time_1)); 

    cout << diff << endl; 

    system("pause"); 
} 
+0

*動作しませんでした* - あなたの質問に追加してください**どのように動作しなかったか**。エラーはありましたか?予期しない出力を受けましたか? –

+0

これは0出力を表示していることを意味し、真ではない、3660(difftime shows seconds) –

+0

両方の 'mktime'呼び出しは' -1'を返して失敗を示します。 'difftime(-1、-1)'がゼロであるという驚きはありません。 –

答えて

2

std::tmは、以下のメンバー(http://en.cppreference.com/w/cpp/chrono/c/tm)を持つ:

int tm_sec; // seconds after the minute – [0, 61](until C++11)/[0, 60] (since C++11) 
int tm_min; // minutes after the hour – [0, 59] 
int tm_hour; // hours since midnight – [0, 23] 
int tm_mday; // day of the month – [1, 31] 
int tm_mon; // months since January – [0, 11] 
int tm_year; // years since 1900 
int tm_wday; // days since Sunday – [0, 6] 
int tm_yday; // days since January 1 – [0, 365] 
int tm_isds; // Daylight Saving Time flag. 

あなたはそれらのメンバーの唯一のカップルを初期化してきました。残りは両方のオブジェクトで初期化されません。

したがって、プログラムには未定義の動作があります。

予測可能な動作を確認するには、オブジェクトを適切に初期化します。 1つの方法は、ユーザー入力を読み取る前に、

tm time_1 = {0, 0, 0, 1, 0, 0, 0, 0, 0}; 
tm time_2 = {0, 0, 0, 1, 0, 0, 0, 0, 0}; 

を使用することです。 time_1time_2私のために働くように見えるを初期化するには

std::time_t t = std::time(NULL); 
std::tm time_1 = *std::localtime(&t); 
tm time_2 = time_1; 

を使用して

更新

http://ideone.com/AmCzTuで作業してください。

+0

'tm_hour'、' tm_min'、 'tm_sec'、' tm_mon'、 'tm_mday'の初期化が必要です。 [例](http://cpp.sh/3wti)。申し訳ありません。 –

+0

'tm time_1 = {0};'は完全な初期化ですが、有効な初期化ではありません。未定義の動作はしませんが、無効な入力のために 'mktime()'は中止されます。 'mktime()'が失敗すると、 '-1'を返し、' -1 'の2つの間の差はOPによって観測されるようにゼロです。 –

+0

@BenVoigt、良い点。答えを更新しました。 –

関連する問題