質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

3回答

2489閲覧

C言語で特定のテンポで処理を実行したい

Munya

総合スコア8

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2017/12/22 07:40

編集2017/12/22 07:55

###前提・実現したいこと
C言語で特定のテンポで処理を実行したいです。
プラットフォームはWindowsです
###該当のソースコード

C

1if (int(fmod(プログラムを実行してからの時間,60.0/BPM)) == 0) 実行する処理

###試したこと
以上のようなソースコードを考えたのですがこれで問題ないでしょうか
またより良い方法をご存知なら教えていただきたいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

PineMatsu

2017/12/22 07:52

プラットフォームを記載してください。Windowsでしょうか?
Munya

2017/12/22 07:54

基本的にはWindowsです
can110

2017/12/22 09:00

if文が呼ばれる頻度(時間間隔)、実行処理により費やされる時間はどれほどを見込まれていますか?
can110

2017/12/22 09:02

「プログラムを実行してからの時間」とはWindowsでのGetTickCount()で得られる値を秒換算したものと考えてよいですか?
guest

回答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
can110

総合スコア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

Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

Windowsであれば、通常はタイマーメッセージ(またはタイマースレッド)で処理します。精度はイマイチですがシビアでなければ、それで事足りるかと。
例えば、100msec毎のタイマースレッドを起動しておいて、10回カウントすれば1秒になるので、そこで処理をする。

投稿2017/12/22 07:58

PineMatsu

総合スコア3579

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問