###前提・実現したいこと
C言語で特定のテンポで処理を実行したいです。
プラットフォームはWindowsです
###該当のソースコード
C
1if (int(fmod(プログラムを実行してからの時間,60.0/BPM)) == 0) 実行する処理
###試したこと
以上のようなソースコードを考えたのですがこれで問題ないでしょうか
またより良い方法をご存知なら教えていただきたいです。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答3件
0
ベストアンサー
ちょっと全体の処理タイミングが不明ですが、判定間隔<処理間隔の場合だと、以下に示すとおり、まずいです。
この場合なら、単純に「次回実行時刻を越えたら処理実行」でよいと思います。
C
1#include <stdio.h> 2#include <stdlib.h> 3#include <math.h> 4 5#define BPM 120 // 実行タイミング [Beats Per Minute] 6#define INTERVAL (60.0/BPM) // 実行間隔[sec] 7 8// 0~0.1[sec]の適当な秒数を返す 9double getSpendTime( void) 10{ 11 return (rand() / (double)RAND_MAX) * 0.1; 12} 13 14// 提示コードによる実装 15void func1( void) 16{ 17 printf("func1\n"); 18 double curTime = 12345; // 適当な時刻からスタート 19 int run_cnt = 0; 20 while(run_cnt < 5){ 21 if( (int)( fmod( curTime, INTERVAL)) == 0){ 22 printf("run at curTime[%.3f] \n", curTime); 23 run_cnt++; 24 } 25 curTime += getSpendTime(); // 適当に時刻を進める 26 } 27} 28 29// 提案する実装 30void func2( void) 31{ 32 printf("func2\n"); 33 double curTime = 12345; // 適当な時刻からスタート 34 double nexTime = curTime + INTERVAL; 35 int run_cnt = 0; 36 while(run_cnt < 5){ 37 if( curTime >= nexTime){ 38 printf("run at curTime[%.3f]\n", curTime); 39 run_cnt++; 40 nexTime += INTERVAL; 41 } 42 curTime += getSpendTime(); // 適当に時刻を進める 43 } 44} 45 46int main(void) { 47 srand(123); 48 49 func1(); 50 /* 51 func1 52 run at curTime[12345.000] 53 run at curTime[12345.006] 54 run at curTime[12345.085] 55 run at curTime[12345.105] 56 run at curTime[12345.140] 57 */ 58 59 func2(); 60 /* 61 func2 62 run at curTime[0.555] 63 run at curTime[1.029] 64 run at curTime[1.535] 65 run at curTime[2.034] 66 run at curTime[2.544] 67 */ 68 69 return 0; 70}
投稿2017/12/22 09:23
編集2017/12/22 09:29総合スコア38233
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
こんにちは。
以上のようなソースコードを考えたのですがこれで問題ないでしょうか
またより良い方法をご存知なら教えていただきたいです。
そのソースで問題ないかもしれないし、問題があるかも知れません。
判断するには情報が足りません。
そのif文がBPMよりも十分に短い間隔で呼ばれる必要があります。
例えば、BPMが120の時、1秒間隔でしか呼ばれなかったら問題外ですね。
if文の実行され方が、0.4秒、0.45秒のように呼ばれた場合、0秒~0.5秒の間に「実行する処理」が2回呼ばれます。
また、0.45秒、0.55秒のように呼ばれた場合、この2回の間隔は0.1秒となります。
更に「実行する処理」に0.5以上かかると当然次の呼び出しは期待どおりにはできないと思います。
対策は色々考えられますが、要件に応じて最適な対策は大きく異なりますので、一概には言えません。
投稿2017/12/22 09:16
総合スコア23272
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。