
この関数は引数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()で渡されるということなのでしょうか?
お手数ですがよろしくお願いします。
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を掛ける訳です。
上記の順序で計算すると精度の問題があるので、この式では先に掛け算から処理しています。
No.3
- 回答日時:
>・c1は関数を呼び出した時点の時間であり0秒固定
念のため:「関数を呼び出した時点の時間(時刻)」を表す値ではありますが、「0秒固定」ではありません。0がセットされるのは、このsleep()関数が初めて呼ばれた時くらいでしょう。二度、三度と呼ばれたら、0以外の値がセットされます。従って「c1 = clock();」を「c1 = 0;」とはできません(二回目からはただちにリターンしてしまい、期待通りの動きをしなくなる)。
No.1
- 回答日時:
clock関数はエラーの時は(clock_t) -1を返す仕様になっています
ただの-1はint型の-1ですのでclock_t型にキャストしています
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- Excel(エクセル) エクセルVBAでセルに表示されているとおりの数値を取得したい(時間の計算結果) 1 2022/03/30 17:52
- 大学・短大 C言語線形リストの問題です 3 2022/12/22 00:45
- その他(スマホアプリ・スマホゲーム) アラームが鳴るじゃないですか? あれ何秒間かとか、ワンコーラス流れたら勝手にストップするアプリありま 2 2023/08/26 22:33
- Excel(エクセル) Excel 数式を教えてください 2 2022/06/02 12:24
- Excel(エクセル) 至急です><Excelの関数を教えてください。 2 2022/03/22 17:56
- Excel(エクセル) エクセルの関数式を教えてください。 2 2022/11/29 21:09
- 英語 The clock was break.と、The clock broken.の違いと、使い分け方を 2 2023/08/23 19:32
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# win10で、正確な待ち時間の作り方 6 2023/02/14 18:28
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
UserForm1.Showでエラーになり...
-
VBAでfunctionを利用しようとし...
-
お助けください!VBAのファイル...
-
【VBA】ワークブックを開く時に...
-
Filter関数を用いた結果、何も...
-
文字列内で括弧を使うには
-
インポート時のエラー「データ...
-
VB2008 comboboxを連動させた...
-
On ErrorでエラーNoが0
-
Scilabのstacksizeの増やし方が...
-
VBでSQL文のUPDATE構文を使った...
-
レコード登録時に「演算子があ...
-
ApplicationとWorksheetFunctio...
-
マクロで"#N/A"のエラー行を削...
-
Excel vbaについての質問
-
VBA エクセル で FIND でのエラ...
-
実行時エラー'-2147467259(8000...
-
ACCESS DAO で不要なテーブルの...
-
HTMLソースが表示のページのも...
-
シングルクォーテーションを含...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
マクロOn Error GoTo ErrLabel...
-
UserForm1.Showでエラーになり...
-
お助けください!VBAのファイル...
-
VBAでfunctionを利用しようとし...
-
【VBA】ワークブックを開く時に...
-
String""から型'Double'への変...
-
文字列内で括弧を使うには
-
マクロで"#N/A"のエラー行を削...
-
Excel vbaについての質問
-
VBA データ(特定値)のある最...
-
On ErrorでエラーNoが0
-
インポート時のエラー「データ...
-
【VBAエラー】Nextに対するFor...
-
ACCESSで値を代入できないとは?
-
【Access】Excelインポート時に...
-
VBでSQL文のUPDATE構文を使った...
-
【VB.NET】 パワポ操作を非表示で
-
「実行時エラー '3167' レコー...
-
実行時エラー 438 の解決策をお...
-
実行時エラー'-2147467259(8000...
おすすめ情報