• ベストアンサー

時間を経過させる関数

この関数は引数xに1000を渡すと1秒の経過をさせる 関数です。 int sleep(unsigned long x) { clock_t c1 = clock(),c2; do { if((c2 = clock()) == (clock_t)-1) return 0; }while(1000.0*(c2-c1)/CLOCKS_PER_SEC<x); return 1; } 質問は3つです。 (1) if((c2 = clock()) == (clock_t)-1) return 0; ・clock()を呼び出し、その結果をc2に代入する。c2が-1だったら、returnする。返却値は0を返す。 つまり、時間の経過中にエラーが起きたら値を返すというものです。 質問としては、「(clock_t)-1」の意味です。「clock_t型から-1を引く?」なぜ-1と等しいのでしょうか? (2) while(1000.0*(c2-c1)/CLOCKS_PER_SEC<x); この文なのですが、なぜc2からc1を引く理由としては ・c1は関数を呼び出した時点の時間であり0秒固定。 ・c2に関しては「上記の不等式が不成立になるまで経過する時間」 と考えてよろしかったでしょうか? (3) また、上記の文の不等式の右辺のxは単位がミリ秒なので、不成立になるには、不等 式の左側は「関数呼び出しから現在までの経過時間(ミリ秒)」になるはずです。 左辺は最初に(c2-c1)を1000倍をしてそこからCLOCKS_PER_SECという 一秒あたりのクロック数(1000)を割っているのでc2やc1は最初から ミリ秒の単位がclock()で渡されるということなのでしょうか? お手数ですがよろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.2

(1) ただ-1と書いただけではint型扱いなのでclock_t型にキャストしてるだけです。つまり、 > 「clock_t型から-1を引く?」 ではなくて「clock_t型の-1」。clock()のエラー値です。 (2)と(3)はひとくくりで説明。 c1は「開始時点のクロック値」を保持しています。 c2は「その時点のクロック値」を常に取得します。 したがって、c2とc1の差を取ることで「開始時点から経過したクロック値」が取得できます。 そして、(c2-c1)/CLOCKS_PER_SECで経過したクロックを秒に換算しています。 それをミリ秒に換算するので1000を掛ける訳です。 上記の順序で計算すると精度の問題があるので、この式では先に掛け算から処理しています。

rinnshan
質問者

お礼

回答ありがとうございました。 ということは(clock_t)-1は-1をクロック値に変換 しているということなのですね。

その他の回答 (2)

  • 6yemon
  • ベストアンサー率69% (25/36)
回答No.3

>・c1は関数を呼び出した時点の時間であり0秒固定 念のため:「関数を呼び出した時点の時間(時刻)」を表す値ではありますが、「0秒固定」ではありません。0がセットされるのは、このsleep()関数が初めて呼ばれた時くらいでしょう。二度、三度と呼ばれたら、0以外の値がセットされます。従って「c1 = clock();」を「c1 = 0;」とはできません(二回目からはただちにリターンしてしまい、期待通りの動きをしなくなる)。

rinnshan
質問者

お礼

なるほど。関数は普通何度も呼び出すものなので その分の経過時間が記録されることになるのですね。

  • php504
  • ベストアンサー率42% (926/2160)
回答No.1

http://www.linux.or.jp/JM/html/LDP_man-pages/man3/clock.3.html clock関数はエラーの時は(clock_t) -1を返す仕様になっています ただの-1はint型の-1ですのでclock_t型にキャストしています

rinnshan
質問者

お礼

わざわざURLを張っていただきありがとうございました。 見ておきたいと思います。

関連するQ&A