C++のすゝめ

実際にプログラムを作ってみよう

C++を使うとどんな書き方になるのか簡単にプログラムで書いてみましょう。
今回は時間を計測するストップウォッチをC言語とC++の両方で書いてみましょう。

先ずはC言語でストップウォッチを作ります。

Stopwatch.h
  1. #pragma once
  2.  
  3. #include <windows.h>
  4.  
  5. // ストップウォッチ情報
  6. struct StopwatchData
  7. {
  8. LARGE_INTEGER Freq; // 周波数
  9. LARGE_INTEGER Start; // 開始時間
  10. };
  11.  
  12. // ストップウォッチの初期化
  13. void InitStopwatch(StopwatchData* pStopwatchData);
  14. // ストップウォッチのリセット
  15. void ResetStopwatch(StopwatchData* pStopwatchData);
  16. // ストップウォッチの経過時間取得
  17. double GetElapsedTime(StopwatchData* pStopwatchData);

Stopwatch.cpp
  1. #include "Stopwatch.h"
  2.  
  3. // ストップウォッチの初期化
  4. void InitStopwatch(StopwatchData* pStopwatchData)
  5. {
  6. QueryPerformanceFrequency(&pStopwatchData->Freq);
  7. ResetStopwatch(pStopwatchData);
  8. }
  9.  
  10. // ストップウォッチのリセット
  11. void ResetStopwatch(StopwatchData* pStopwatchData)
  12. {
  13. QueryPerformanceCounter(&pStopwatchData->Start);
  14. }
  15.  
  16. // ストップウォッチの経過時間の取得
  17. double GetElapsedTime(StopwatchData* pStopwatchData)
  18. {
  19. LARGE_INTEGER End;
  20. QueryPerformanceCounter(&End);
  21.  
  22. const LONGLONG TICK_DELTA = 1000000000;
  23. const double INV_TICK_DELTA = 1.0 / (double)TICK_DELTA;
  24.  
  25. LONGLONG elapsed = (End.QuadPart - pStopwatchData->Start.QuadPart);
  26. return (double)((elapsed * TICK_DELTA) / pStopwatchData->Freq.QuadPart) * INV_TICK_DELTA;
  27. }


これで実際に計測をしてみます。

main.cppなど適当な箇所で下記を記載します。

  1. #include <windows.h>
  2. #include <stdio.h>
  3. #include "Stopwatch.h"
  4.  
  5. int APIENTRY WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
  6. {
  7. StopwatchData stopwatchData;
  8. InitStopwatch(&stopwatchData);
  9. ResetStopwatch(&stopwatchData);
  10.  
  11. // 120msの待ちを入れる
  12. Sleep(120);
  13.  
  14. double elapsed = GetElapsedTime(&stopwatchData);
  15. char temp[64];
  16. sprintf_s(temp, "time:%f\n", elapsed);
  17. OutputDebugStringA(temp);
  18. }


・結果
time:0.120951

実行してみると出力ウィンドウに上記のような結果に大体120msの結果が出るかと思います。
この結果ならちゃんと計測できてますね。

1 2 3

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です