質問するログイン新規登録

回答編集履歴

4

コード修正

2021/10/26 03:06

投稿

fj68
fj68

スコア752

answer CHANGED
@@ -18,7 +18,7 @@
18
18
 
19
19
  int main() {
20
20
  struct timespec start, current;
21
- int diff = 0;
21
+ time_t diff = 0;
22
22
  clock_gettime(CLOCK_MONOTONIC, &start);
23
23
 
24
24
  while (diff < 10) {

3

誤字修正

2021/10/26 03:05

投稿

fj68
fj68

スコア752

answer CHANGED
@@ -1,11 +1,10 @@
1
1
  【追記】
2
2
  `clock_gettime()`を使ったコードに変更しました。
3
3
 
4
- 計測を開始した時点での`clock_gettime()`の値と、現在の`clock_gettime()`の値の**差が10秒以下の間処理を繰り返す**プログラムを書けば、HIG4TOさんのやりたいことが実現できるのではないでしょうか。
5
-
6
- なお、`clock_gettime()`は`timespec`型の値を返し、`timespec`型は秒とナノ秒の情報が入った構造体です。
4
+ `clock_gettime()`は`timespec`型の値を返し、`timespec`型は秒とナノ秒の情報が入った構造体です。
7
5
  `clock_gettime(CLOCK_MONOTONIC, &timespec型の変数)`とすると単調増加の値が得られます。
8
6
  計測を始めた時点の値と現在の値の**差が10秒以下の間処理を繰り返す**プログラムを書けばHIG4TOさんのやりたいことが実現できるのではないでしょうか。
7
+
9
8
  今回はナノ秒のオーダーは必要ないと思われますので、単純に秒のみを比較します。
10
9
  処理を繰り返すときは定期的に`sleep()`のような関数を呼び出さないとハングアップしてしまいますので注意です。
11
10
 

2

参考文献を追加

2021/10/26 03:02

投稿

fj68
fj68

スコア752

answer CHANGED
@@ -11,6 +11,8 @@
11
11
 
12
12
  HIG4TOさんの環境が不明ですのでここでは`unistd.h`の`usleep()`を使っていますが、Windowsなどの場合は代替となる関数(`windows.h`の`Sleep()`とか)をググってみてください。
13
13
 
14
+ [時間情報の取得 clock_gettime() - 時間の扱い - 碧色工房](https://www.mm2d.net/main/prog/c/time-05.html)
15
+
14
16
  ```c
15
17
  #include <time.h>
16
18
  #include <unistd.h>

1

clock_gettimeをつかったコードに変更

2021/10/26 03:01

投稿

fj68
fj68

スコア752

answer CHANGED
@@ -1,10 +1,14 @@
1
+ 【追記】
1
- `gettime`というのが何の関数なのか不明ですが、考え方は共通する部分もあると思いますので、C標準の`time()`を使った一例を紹介しま
2
+ `clock_gettime()`を使ったコードに変更しました
2
3
 
3
- `time()`は「西暦 1970 年1月1日からの経過秒数」を返す関数です。
4
- 計測を開始した時点での`time()`の値と、現在の`time()`の値の**差が10秒以下の間処理を繰り返す**プログラムを書けば、HIG4TOさんのやりたいことが実現できるのではないでしょうか。
4
+ 計測を開始した時点での`clock_gettime()`の値と、現在の`clock_gettime()`の値の**差が10秒以下の間処理を繰り返す**プログラムを書けば、HIG4TOさんのやりたいことが実現できるのではないでしょうか。
5
5
 
6
- なお、`time()`は`time_t`型の値を返し、`difftime()`で2つの`time_t`の値の差を得ることができます。
6
+ なお、`clock_gettime()`は`timespec`型の値を返し、`timespec`型は秒ナノ秒の情報入った構造体です。
7
+ `clock_gettime(CLOCK_MONOTONIC, &timespec型の変数)`とすると単調増加の値が得られます。
8
+ 計測を始めた時点の値と現在の値の**差が10秒以下の間処理を繰り返す**プログラムを書けばHIG4TOさんのやりたいことが実現できるのではないでしょうか。
9
+ 今回はナノ秒のオーダーは必要ないと思われますので、単純に秒のみを比較します。
7
10
  処理を繰り返すときは定期的に`sleep()`のような関数を呼び出さないとハングアップしてしまいますので注意です。
11
+
8
12
  HIG4TOさんの環境が不明ですのでここでは`unistd.h`の`usleep()`を使っていますが、Windowsなどの場合は代替となる関数(`windows.h`の`Sleep()`とか)をググってみてください。
9
13
 
10
14
  ```c
@@ -12,17 +16,17 @@
12
16
  #include <unistd.h>
13
17
 
14
18
  int main() {
19
+ struct timespec start, current;
15
- time_t diff, start;
20
+ int diff = 0;
21
+ clock_gettime(CLOCK_MONOTONIC, &start);
16
22
 
17
- diff = (time_t)0;
18
- start = time(NULL);
19
-
20
23
  while (diff < 10) {
21
24
  usleep(0.5 * 1000000); // 0.5秒待つ
22
25
 
23
26
  // その他いろいろやる
24
27
 
28
+ clock_gettime(CLOCK_MONOTONIC, &current);
25
- diff = difftime(time(NULL), start);
29
+ diff = current.tv_sec - start.tv_sec;
26
30
  }
27
31
 
28
32
  return 0;