重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

この関数は引数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()で渡されるということなのでしょうか?

お手数ですがよろしくお願いします。

A 回答 (3件)

(1)


ただ-1と書いただけではint型扱いなのでclock_t型にキャストしてるだけです。つまり、
> 「clock_t型から-1を引く?」
ではなくて「clock_t型の-1」。clock()のエラー値です。

(2)と(3)はひとくくりで説明。
c1は「開始時点のクロック値」を保持しています。
c2は「その時点のクロック値」を常に取得します。
したがって、c2とc1の差を取ることで「開始時点から経過したクロック値」が取得できます。
そして、(c2-c1)/CLOCKS_PER_SECで経過したクロックを秒に換算しています。
それをミリ秒に換算するので1000を掛ける訳です。
上記の順序で計算すると精度の問題があるので、この式では先に掛け算から処理しています。
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/11/17 12:16

>・c1は関数を呼び出した時点の時間であり0秒固定



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

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

お礼日時:2009/11/17 12:14

http://www.linux.or.jp/JM/html/LDP_man-pages/man …
clock関数はエラーの時は(clock_t) -1を返す仕様になっています
ただの-1はint型の-1ですのでclock_t型にキャストしています
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/11/17 12:16

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!