旅行好きのおしりトラブル対策グッズ3選

C言語でタイマーを使ってprintf文を記述することで
「1秒経過」、「2秒経過」、「3秒経過」のように表示させたいのですが、どのように表示させるのでしょうか?
タイマーの間隔は、できれば1 [ms]だとうれしいてす。
回答お願いします

A 回答 (4件)

> まずはC言語のプログラミングでの動作を実証してみてから、


> マイコンへの書き込みを考えています。

といわれても、処理のロジックをパソコンのCで実証するということはありますけど、タイマのようなシステムよりというか、ハードウエアよりのものは、なかなか。

とはいえ、パソコンで秒単位ということであれば、

#include <stdio.h>
#include <time.h>

int main()
{
time_t last = time(0);
time_t next;
int pastSec = 0;

while(1)
{
if (time(&next) != last)
{ last = next;
pastSec++;
printf("%d 秒経過\n", pastSec);
}
}

return 0;
}

こんなので可能です。
同じように標準の time.h や time() 関数があれば、同じように動きますが。

と書きましたが、実際の所、このコードも、http://oshiete.goo.ne.jp/qa/6396223.html で書いたコードもそっくりさんではあるのですね。

time() 関数が1秒ごとに異なる数値を返せば、とりあえず、このプログラムは動くわけです。
たとえば、


volatile int m10Count;

void m10Int() // この関数は 10ms 間隔で割り込まれる
{
m10Count++;
m10Count %= 10000; // オーバーフロー対策(時間の長さによってはこれ必須)
}

time_t time(time_t *timer)
{
*timer = m10Count / 100;
return *timer;
}

とすれば、1秒単位程度であれば、main() は、同じコードで動かすことができます。
    • good
    • 0

> 指摘された質問と同じものです。


> まずはC言語のプログラミングでの動作を実証してみてから、
> マイコンへの書き込みを考えています。

なんとなく。

本当に必要なのは,C言語でどうこうではなくて,
マイコンの周辺デバイスの使い方とか,レジスタの設定の仕方といった,
低レベル(ハードウェアに近いという意味です)な話ではないのでしょうか?
    • good
    • 0

処理系に依存した方法になります。



どのような環境でしょうか?

↓と関係ありますか?
http://oshiete.goo.ne.jp/qa/6396223.html

この回答への補足

何度も回答ありがとうございます。
指摘された質問と同じものです。
まずはC言語のプログラミングでの動作を実証してみてから、
マイコンへの書き込みを考えています。

補足日時:2010/12/21 11:17
    • good
    • 0

幾つかの課題がある。


まず、printfで書くというのは、表示ごとに行を進めていくの? それとも同じ位置で数値だけ書き換えるの? 前者だったら、タイマ周期でprintfを呼び出すだけ。後者だとコンソール依存になる。コンソールの持つカーソル制御機能を使うので。
次に、タイマーの周期。1秒周期だとsleep関数などで比較的簡単に実装できる。ミリ秒単位だとリアルタイムOSでないとタイマー待ちでは難しい。OSの最小タイマ刻みが10ミリ秒とかいうことが平気であるので。そうすると待てないのでループで時刻を監視して表示更新(いわゆるビジーウェイト)という方式になるが、これでもディスクアクセスなどOS処理にCPUが取られて1ミリ秒周期を守り続けることは難しくなる。
    • good
    • 0
この回答へのお礼

すばやい回答ありがとうございます。

最初にprintf文は表示ごとに行を進めたいと思っています。
また、タイマーの周期なのですが、1秒が簡単にできるのであれば、まずは周期1秒からはじめてみたいと考えています。
プログラムのソースの例だけでも、よろしかったら記述お願いします。

お礼日時:2010/12/20 17:37

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

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QC言語のプログラミングについて

マイコン内部のタイマーを使ってmainのプログラムにprintf文を記述することでteraterm上に1秒経過、2秒経過、3秒経過と表示させたいのですが、どのように表示させるのでしょうか?
10 [ms]ごとにタイマの割り込み要求を出すプログラムは作成したのですが、mainプログラムの表示のやり方がわかりません。
マイコンとパソコンの通信はできるようにしてあります。
回答お願いします。

Aベストアンサー

「マイコンとパソコンは通信できるようになっている」のですよね。
これが具体的にはどういう通信なのかにもよりますが。
たとえば、putchar('A'); で、TeraTerm 側に、A が表示されるというようなものが準備できているということでしょうか。
さらに、10msごとに割り込みを発生させるプログラムは既に作成済みということですね。
だとすると、10msごとに、関数(下記の例では、void 10Int())を呼び出すことができます。

printf() で UART にデータを送る事ができるのであれば、下記のソースで良いかなと思います。
あと、TeraTerm で受けるとすると、"\n" じゃなくて、"\r" のほうが一般的かもしれません。


voltile int m10Count;

int main()
{
int secCount;
m10Count = 0;

// ここでタイマ割り込みを許可
// 具体的な方法は処理系により様々

while(1)
{
if(checkDiff != (m10Count / 100))
{
secCount = m10Count / 100;
printf("%d秒後\n", secCount);
}
}

return 0;
}

#pragma interrupt(m10Int)
// ここの指定は処理系により様々

void m10Int()
{
m10Count++;
}

UARTから出力できるようなprintf()がない場合は

sprintf() があるなら……

char buff[64];
sprintf(buff, "%d秒後\n", secCout);
for(i = 0; buff[i]; putchar(buff[i++]));
という感じで。(putchar() は具体的にパソコンに1バイト送信する関数に置き換えるとして)

sprintf() もない場合には……
たとえば、http://www.nest4.net/tec/strnum.html で紹介されているライブラリを使って、

char buff[] = "xxxx秒後\n";
toStr(secCount, buff, 4, 10);
zeroSuppress(buff);
for(i = 0; buff[i]; putchar(buff[i++]));

こんな感じでいけるかと。

「マイコンとパソコンは通信できるようになっている」のですよね。
これが具体的にはどういう通信なのかにもよりますが。
たとえば、putchar('A'); で、TeraTerm 側に、A が表示されるというようなものが準備できているということでしょうか。
さらに、10msごとに割り込みを発生させるプログラムは既に作成済みということですね。
だとすると、10msごとに、関数(下記の例では、void 10Int())を呼び出すことができます。

printf() で UART にデータを送る事ができるのであれば、下記のソースで良いかなと思いま...続きを読む

Qsleep()関数について

"数秒おきに警報をn回鳴らすプログラム"をC言語で作成しようと
考えています。

プログラム実行環境はWindowsですが、
sleep()関数は使用できないのでしょうか??

仮に使用できない場合、この関数に代わる関数や代替方法が
あれば教えて頂けませんでしょうか? 宜しくお願いします。

Aベストアンサー

正確な動作でも構わなければ
windows.hをインクルードして
Sleep()関数を使いましょう.
http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200207/02070061.txt

しかし,正確に数秒おきに動作を行いたい場合はマルチメディアタイマ等を使いましょう.
マルチメディアタイマはミリ秒間隔でコールバック関数を呼び出すことができます.
timeSetEventを用いてコールバック関数の登録を行うことができます.
timeKillEventでコールバック関数の解除を行うことができます.

多分他にも方法があると思うのですが…私はこれぐらいしか知りません^^;

参考URL:http://www.katto.comm.waseda.ac.jp/~katto/Class/GazoTokuron/code/time.html

QC言語でタイマーを作成する方法について

初歩的な質問で申し訳ございません。

C言語を使用して、
何らかのイベントから1分後にタイマーを設定し、時間が経過したら
メッセージを表示するプログラムを作成する方法について
教えて頂けませんでしょうか?

#マニュアルを調べてみると、setitimer()という関数があるよう
#ですが、引数に渡す値がよくわかりません。この関数は関係ない??

Aベストアンサー

『C言語』といってもいろいろな環境で実行されます
settimerが使えるかどうかは 開発環境/実行環境に依存すると思いますよ

開発環境が VC++6.0 Pro
実行環境が Windows XP/2000
といった情報を質問には明記しましょう

Windowsの場合
SetTimerは ウインドウハンドル、タイマーの識別子、間隔、タイマー処理実行コールバック関数ポインタといった引数を取ります
タイマー識別子とは 1番は200msごと 2番は1sごとなどの判断するための番号
間隔は 1ms単位で指定する 1秒ならば1000
タイマー処理実行コールバック関数ポインタは特殊な処理をするのでなければ NULLでかまわない
ウィンドウハンドルはこのタイマーを所有(使用)するウィンドウのハンドル

タイマー処理実行コールバック関数ポインタでNULLを指定した場合
WndProcのWM_TIMERでタイマー起動時の処理を記述します

使い終わった場合 KillTimer(タイマー識別子); でタイマーを止めましょう

Q1秒毎に1カウントアップ

1秒経つとカウントを一つアップするというプログラムを作ろうと思いますが、sleep関数を使う事でOKでしょうか?

ネットで調べてみるとsleep関数の精度はあまり高くないと書かれていました。カレンダーを表示するプログラムに使いたいのであまり精度が悪いと困ってしまいます。もし何か他に良い方法があれば教えてください。よろしくお願いします。

Aベストアンサー

OSがWindowsで言語がC、Win32を使うものと
仮定しますと

SetTimer関数を使用します

使用方法は以下のURLです
http://yokohama.cool.ne.jp/chokuto/advanced/function/SetTimer.html

QLNK2019: 未解決の外部シンボルのエラーが出る

Microsoft Visual Studio 2008
Version 9.0.21022.8 RTM
Microsoft .NET Framework
Version 3.5 SP1
----------------------------------------------------------------
新しいプリジェクト→Win32 コンソール アプリケーション(ソリューションのディレクトリを作成 チェック外す)→Windows アプリケーション(空のプロジェクト チェック外す)
----------------------------------------------------------------
 プログラム

 mymain.cpp
#include "myhelper.h"
#include "mymain.h"

//自キャラのデータ
Point2D g_jikipos = {40, 400};//自キャラの座標

//画像ハンドル
int g_jikiimage[11];

//色々なファイルの読み込み
int LoadFiles(){
//画像ファイル読み込み
if(LoadDivGraph("media\\player01.bmp",
11,11,1,64,64,g_jikiimage) == -1) return -1;

return 1;
}


 mymain.h
//他から呼び出させるMyMainの関数
void MyMain();
int LoadFiles();


 myhelper.h(サンプルなので打ちミスはない)
#include "DxLib.h"
#include <limits.h>
#include <math.h>

//構造体宣言
//座標またはベクトルを記録する構造体
struct Vector{
float x,y;
};
typedef Vector Point2D;
//線を記録する構造体
struct Line2D{
Point2D startpos, endpos;
float katamuki;//傾きをラジアン値で記録
Vector speed;//移動している場合は速度をセット
};
//球体を記録する構造体
struct Ball2D{
Point2D position;
float hankei;//半径
};
//四角形を記録する構造体
struct Rect2D{
Point2D lefttop;
Point2D rightbottom;
float width;
float height;
};


//ライブラリ関数
Point2D PosInView(Point2D in);
int XInView(float inx);
int YInView(float iny);
void ScrollToLeft(float jikiposx);
void ScrollToRight(float jikiposx);
void ScrollToUp(float jikiposy);
void ScrollToDown(float jikiposy);
void DrawLineInView(float x1, float y1, float x2, float y2, int Color, int Thickness);
void DrawCircleInView(float x, float y, float r, int Color, int FillFlag);
void DrawAnimation(float x, float y, double ExtRate, double Angle,int TurnFlag,
int *imgarray, int allframe, float fps);
//ベクトル関数
Vector CreateVector(Vector in, float veclen);
Vector AddVector(Vector v1, Vector v2);
Vector SubVector(Vector v1, Vector v2);
Vector AddVectorInFrameTime(Vector pos, Vector speed);
Vector AddVectorInFrameTime2(Vector pos, Vector speed, Vector accel);
Vector Normalize(Vector in);
Vector RotateVector(Vector in, float radian);
float VectorLengthSquare(Vector in);
float DotProduct(Vector v1, Vector v2);
float CrossProduct(Vector v1, Vector v2);
void SetLine2DKatamuki(Line2D *in);
void DrawLine2D(Line2D in, int Color, int Thickness);
void DrawBall2D(Ball2D in, int Color, int Fill);
//当たり判定関数
bool HitTestLineAndBall(Line2D linein, Ball2D ballin);
bool IsPointAtLineFace(Line2D linein, Point2D ptin);
bool HitTestLineAndLine(Line2D line1, Line2D line2);
bool HitTestBallAndBall(Ball2D a, Ball2D b);
bool HitTestPointAndBox(Rect2D rect, Point2D pt);
//タイマー関数
void SetSimpleTimer(int idx, int time);
int GetPassedTime(int idx);


//グローバル変数
extern float g_frametime;
extern Rect2D g_framerect;//画面領域(当たり判定)
extern Point2D g_current_field_pos;//現在の左上座標
extern Rect2D g_stagesize;//ステージサイズ

//定数宣言
const float ZEROVALUE = 1e-10f;
const float PIE = 3.1415926f;
const int SCROLL_LIMIT = 200;
----------------------------------------------------------------
 エラー内容
1>myhelper.obj : error LNK2019: 未解決の外部シンボル "void __cdecl MyMain(void)" (?MyMain@@YAXXZ) が関数 _WinMain@16 で参照されました
1>C:\Documents and Settings\Owner\My Documents\Visual Studio 2008\Projects\my\Debug\my.exe : fatal error LNK1120: 外部参照 1 が未解決です
1>my - エラー 2、警告 0
ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ
----------------------------------------------------------------
画像を貼り付けときます
(見えにくい場合→http://www.dotup.org/uploda/www.dotup.org154142.jpg.html)
初心者なのでわかりやすくお願いします

Microsoft Visual Studio 2008
Version 9.0.21022.8 RTM
Microsoft .NET Framework
Version 3.5 SP1
----------------------------------------------------------------
新しいプリジェクト→Win32 コンソール アプリケーション(ソリューションのディレクトリを作成 チェック外す)→Windows アプリケーション(空のプロジェクト チェック外す)
----------------------------------------------------------------
 プログラム

 mymain.cpp
#include "myhelper.h"
#include "mymain.h"

//自...続きを読む

Aベストアンサー

ファイル構成から推測するに
mymain.cpp というファイルに
void MyMain(void) {
// ここに処理を書く
}
という関数が必要なようです。

Qint型からchar型への変換

タイトル通り、int型からchar型への変換の仕方がわかりません!><
どうしたらいいのでしょうか?

Aベストアンサー

#include <stdio.h>


char buf[5];
int no;

no = 10;
sprintf(buf, "%d", no);

QDWORDの実際の型は何でしょうか

VC++.NETの環境です。
DOWRD dw1 = 1;
int i = 2; と定義し
ここで
if ( i > dw1 ){
何かの処理;
}
とコーディングすると
warning C4018: '>' : signed と unsigned の数値を比較しようとしました。
のワーニングがでます。
これは、DWORDがint型でなくunsigned int型のようにも見えます。
ある本によれば(VC++.V.NET逆引き大全500の極意)
DWORD はint型であると記述されています。
もし、int型ならこのワーニングはでないはずなのですが、
なぜでるのでしょうか。又、DWORDの実際の型は何なのでしょうか。ご存じのかたおりましたら、教えていただけませんでしょうか。

Aベストアンサー

型定義が知りたいのならば、宣言ファイルを見れば疑問を挟む余地もありません。
DWORD型はwindef.hで
"typedef unsigned long DWORD;"
と宣言されています。

Visual Studioを使っているのならば、知りたい型の上にマウスポインタを置いて右クリック、ポップアップメニューの「定義へ移動」または「宣言へ移動」で簡単に知ることが出来ます。

Q#include というヘッダファイルについて

お早う御座います。
Cの初心者です、宜しくお願いします。
「#include <Windows.h>」というヘッダファイルはどのようなプログラムを書いたときにincludeしてやる必要があるのでしょうか。
宜しくお願いします。

Aベストアンサー

VisualStudioなら、<Windows.h>の部分を右クリックして
「定義ファイルに移動」のような項目で中身を見れたと思います。
そこに定義されている関数や定数を使う場合にincludeしてあげる必要があります。
※Windows.hの中身は弄らないでください

Qファイルやディレクトリの存在確認を行う方法

ファイルをオープンするのはfopenでOKですが、ファイルやディレクトリの存在確認を行う方法が知りたいです。

何か組み合わせて作るものなのでしょうか?
perlとか便利な演算子があるのですが、C/C++って器用ではないですね。
これは処理系?依存の内容ですか?

私の環境は VC6, VC2005 Windows2000です。

Aベストアンサー

int access(const char* path, int mode);
int stat(const char* path, struct stat* sb);

かな?
MSDN を引くと _access_s() を使えとか書いてあるけど。

QEnterキーを押されたら次の処理に移るという事をしたい。

コンソールアプリケーション上で文字列を表示させた後、ユーザーがエンターキーを押したら次の文字列を表示するという仕様にしたいのですが、エンターキーだけ入力待ちにするっていうのはどのように書けばいいんでしょうか?

Aベストアンサー

#include <stdio.h>

int main(void)
{
char *str[] = {"abc", "def", "ghi", "jkl"};
int i;

for(i = 0; i < 4; i ++){
while(getchar() != '\n') ;
puts(str[i]);
}
return 0;
}


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報