0

私は、マウスとキーボードが非アクティブのときに数分でカウントするアイドルプログラムを作成してきました。これは私がこれまでに持っているものです:

using namespace std;

while(true)
{
    GetLastInputInfo(&last_info);
    tickCount = GetTickCount();
    int minutes = (tickCount - last_info.dwTime) / 60000;
    count++;

    if((minutes >= 1) && (count%3000==0))
    {
        ifstream in("in.txt");
        ofstream out("out.txt");
        float sum;
        in >> sum;
        sum = sum++;
        out << sum;
        out << in.rdbuf();
        out.close();
        in.close();
    }
    std::cout << "Idle Time: " << minutes << " minutes." << std::endl;
}
}

アイドル状態で1分間実行すると、「合計」は1と表示され、プログラムを閉じてもう一度1分間開き、「合計」は2と表示されます。プログラムを閉じてさらに1分間開き、 1に戻ります。なぜこれが起こっているのですか?

4

2 に答える 2

5

この行は未定義の動作です。

sum = sum++;

シーケンスポイント間で変数を複数回変更することはできません。sum変数をインクリメントするには、代わりにこれを書く必要があります。

sum++;
于 2012-07-30T19:09:19.533 に答える
2

これが私が起こると思うことです。

in.txtの内容1

out.txtの内容212 1

inからsumに値を読み取る場合、sum = 1; sum ++が発生すると、sumは2になります。

2はout.txtに入ります。次に、1がout.txtに入ります。次に、「アイドル時間」を出力します。合計は常に1に初期化されるため、それはぐるぐる回っています。

この行をコメントアウトしてみてください

 out << in.rdbuf();

または、より広いスコープで合計を宣言します(ファイル読み取りループの外側)

また、あなたはそれに分を追加することは決してないようです...

編集:これを試してみましょう...

if((minutes >= 1) && (count%3000==0))
{
    time_t date = time(NULL); //store the time in our date
tm* timePtr = localtime(&t); //now we can extact dates out of it

    int day = timePtr->tm_mday;
    int month = timePtr->tm_mon;
    int year = 1900 + timePtr->tm_year; //trust me, you gotta 1900 to it.
    char* filename;
    sprintf(filename, "log-%d-%d-%d.txt", day, month, year);
    ifstream in(filename);
 //   float sum; why is this float when we do sum++ below?
    int sum;
    in >> sum;
    sum++;
    in.close();
    ofstream out(filename);
    out << sum;
    out.flush();
    out.close();
}
于 2012-07-30T18:47:30.957 に答える