マルシェル新規登録で5000円分当たる

「一定時間ごとにプログラムを起動させる」プログラムを、
作成したいと考えております。

#include <windows.h>
#include <stdio.h>
void CALLBACK kidou()
{
char pass[255];
sprintf(pass,"./test1.exe");
ShellExecute(NULL, NULL, pass, NULL, NULL, SW_SHOWNORMAL);
}
void main()
{
SetTimer(NULL,1,1000,kidou);
}
この様な感じで作成しましたが、「test.exe」を起動できませんでした。
どのような修正をしたら良いのか教えていただけないでしょうか?

A 回答 (2件)

問題点が2点あります。



1. kidou関数がTIMEPROC型ではない。
SetTimerに渡すためにはkidou関数は、
void CALLBACK kidou(HWND hWnd, UINT nMsg, UINT nIDEvent, DWORD dwTime)
と宣言されいる必要があります。
このままではコンパイルもできないのではないでしょうか。

2. メッセージループが無い
SetTimerはWM_TIMERメッセージをPostすることを指示するだけなので、
それを受け取る部分を用意しておかないとkidou関数は呼び出されません。
SetTimer呼び出し後にメッセージループを挿入する必要があります。

以上の問題を修正すると、次のようになります。

#include <windows.h>
#include <stdio.h>

void CALLBACK kidou(HWND hWnd, UINT nMsg, UINT nIDEvent, DWORD dwTime)
{
char pass[255];
sprintf(pass,"./test1.exe");
ShellExecute(NULL, NULL, pass, NULL, NULL, SW_SHOWNORMAL);
}

void main()
{
SetTimer(NULL,1,1000,kidou);
MSG msg;
BOOL bRet;
while ((bRet = GetMessage(&msg, NULL, 0, 0)) != 0) {
if (bRet == -1) {
break;
}else {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
}

一応Visual C++.NET 2003で一定時間ごとにkidouが呼び出されることは確認しました。

最初に提示されたコードにSetTimerが書いてありましたのでSetTimerを使いましたが、
コンソールアプリケーションならば、SetTimer&メッセージループという大仰なものを
使うよりは、Sleepで1秒待った方が楽だと思います。
Sleepを使うと以下のようになります。

void kidou()
{
char pass[255];
sprintf(pass,"./test1.exe");
ShellExecute(NULL, NULL, pass, NULL, NULL, SW_SHOWNORMAL);
}

void main()
{
while (1) {
Sleep(1000);
kidou();
}
}
    • good
    • 0
この回答へのお礼

何故か、BorlandのコンパイラではSetTimerの方をコンパイル出来ませんでした。

Sleepの方は上手くできましたので、こちらでやろうと思います。
ご回答頂きありがとうございました。

お礼日時:2005/01/08 21:48

test.exeじゃなくて"./test1.exe"と書いてあるから


じゃないんでしょうか。

というのは多分冗談だと思いますが、mainからタイ
マーを設定した直後にこのプログラムは終了してし
まうではありませんか。なので、kidou()関数がコー
ルされる機会がなくなっているのだと思います。

SetTimer()の後にscanf(), getc()などでユーザ入
力があるまで停止するような関数をコールすれば、
test.exeが動き出すと思います。
    • good
    • 0
この回答へのお礼

記入ミスしてしまいました。すいません(汗)

scanfを使ってみたのですが、上手くいきませんでした。
ご回答頂きありがとうございました。

お礼日時:2005/01/08 21:43

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

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

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

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

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

Aベストアンサー

> まずは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() は、同じコードで動かすことができます。

> まずは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;
...続きを読む

Qint型からchar型への変換

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

Aベストアンサー

#include <stdio.h>


char buf[5];
int no;

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

Q一定時間たつと、リセットしたい

C言語であるプログラムを作成中なんですが、一定時間たつとプログラムをリセットしてまた最初からプログラムを実行するような感じにしたいのですが、わからず困っています。
例えば、

if (100秒たったら) {
配列に入ってるデータなどをリセットして、
最初から実行。
}
という感じにしたいと思ってます。要するに、プログラムを実行してから、時間を数え、100秒たったらまた1から実行しなおすという風にしたいと考えています。
そういう時間を数える関数などはあるのでしょうか?
どなたかご教授おねがいします。

Aベストアンサー

期待している回答でないかもしれませんが。。。
--

time_t start,stop;
n=(実行回数);
while(n--){
time(&start);
time(&stop);
while(difftime(stop,start)<100.0){ // 100秒たったらループを抜ける
time(&stop);
}

//--
// (実行したいプログラム)
//--

}

--
精度は秒だったかもしれません

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

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

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

Aベストアンサー

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

SetTimer関数を使用します

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

Q画像を表示するには

C言語をおぼえたてなんですが
文字はprintfで表示するやり方がわかるんですが
画像はどのように表示するのでしょうか?

Aベストアンサー

★アドバイス
・コンソール・アプリケーションでは画像を出せません。
 C言語でも命令(関数)が存在しません。
 画像を表示するには GUI アプリケーションで作る必要があります。
>C言語をおぼえたてなんですが
 ↑
 画像を出す(描画)するにはまだまだ時間が掛かりそうですね。
 でもミニゲームとしてなら次のリンクをどうぞ。
 (1)http://www.nhk.or.tv/kow/program/index.php→『テトリスの作り方』
 コンソール・アプリケーションでも文字を利用してテトリスが作れるようです。
・あと画像を使った場合は GUI アプリケーションになりますが、こちらは次のサイトを
 参考にして下さい。サンプル・ソースをダウンロードできます。
 (2)http://codezine.jp/a/article/aid/207.aspx→『落ち物ゲームの作り方 第1回:「TETRA」編』
 (3)http://codezine.jp/a/article/aid/228.aspx→『落ち物ゲームの作り方 第2回:「聖夜の落とし物」編』
 ダウンロードしてソースファイルを見て下さい。
 C言語ですが知らないような関数名がたくさん使われています。
 これは Win32 API の関数群です。C言語の標準関数とは別の種類です。
 Windows OS では内部はすべて Win32 API を使って処理されています。
 公開されている関数以外にも非公開関数もあります。まぁ、当然かな。
・今後のために GUI アプリケーションのサイトと本を紹介します。
 お決まりですが下のサイトを参考にして下さい。
 http://www.kumei.ne.jp/c_lang/→『猫でもわかるプログラミング』SDK編を読むこと。
 http://wisdom.sakura.ne.jp/system/winapi/→『Win32 API入門』本もお勧め。
 http://www.geocities.jp/ky_webid/win32c/index.html→『Win32API(C言語)編』お勉強サイトです。
・以上。

参考URL:http://www.amazon.co.jp/dp/4797333332/

★アドバイス
・コンソール・アプリケーションでは画像を出せません。
 C言語でも命令(関数)が存在しません。
 画像を表示するには GUI アプリケーションで作る必要があります。
>C言語をおぼえたてなんですが
 ↑
 画像を出す(描画)するにはまだまだ時間が掛かりそうですね。
 でもミニゲームとしてなら次のリンクをどうぞ。
 (1)http://www.nhk.or.tv/kow/program/index.php→『テトリスの作り方』
 コンソール・アプリケーションでも文字を利用してテトリスが作れるようです。
・あと画像を使...続きを読む

Q構造体のメンバが配列の場合の扱い

typedef struct _info_t{
int xxx;
int yyy;
int zzz;
} info_t;

typedef struct _gData{
int aaa;
 int bbb;
info_t infoData[100];
} gData_t;

gData_t gMainData;

質問1
C言語で上記のようなグローバルのデータを作成しようとしています。
gMainDataの中身を初期化するにはどうするのがベストでしょうか?
(特にinfoData[100]の初期化)

質問2
gMainData.infoData[XXX]には info_t型のtmpDataを代入しようとしていますが
gMainData.infoData[XXX] = tmpData;
データがはいっているかどうかはどう判定するべきでしょうか?


質問3
以下のようにポインタを使うのは間違いでしょうか?
typedef struct _gData{
int aaa;
 int bbb;
info_t *infoData[100];
} gData_t;


初期化
memset(gMainData.infoData,NULL, 100);

データの代入
*gMainData.infoData[XXX] = tmpData;

データの有無判定
if( gMainData.infoData[XXX] == NULL){

}

typedef struct _info_t{
int xxx;
int yyy;
int zzz;
} info_t;

typedef struct _gData{
int aaa;
 int bbb;
info_t infoData[100];
} gData_t;

gData_t gMainData;

質問1
C言語で上記のようなグローバルのデータを作成しようとしています。
gMainDataの中身を初期化するにはどうするのがベストでしょうか?
(特にinfoData[100]の初期化)

質問2
gMainData.infoData[XXX]には info_t型のtmpDataを代入しようとしていますが
gMainData.infoData[XXX] = tmpData;
データがはいっているかどう...続きを読む

Aベストアンサー

1.初期化
ループでもmemsetでもよいと思います。どれがベストかはケース・バイ・ケースでしょう。

ただしmemsetの第2引数はint型、第3引数はバイト数なので、次のようにするべきです。
memset(gMainData.infoData, 0, 100 * sizeof(info_t));

また、C言語の規格により static 変数を明示的に初期化しなければ全て 0 になるので
static gData_t iniData;
gData_t data;
と定義しておいて
data = iniData;
のように初期化する方法も(一応)あります。


2.データの代入

info_t *infoData[100] は構造体の配列ではなく、ポインタの配列です。
infoData をポインタにするなら、構造体を下のようにすれば

typedef struct _gData {
 int aaa;
 int bbb;
 info_t *infoData[100];
 info_t _infoData[100];
} gData_t;

次のように代入することができます。

data._infoData[XXX] = tmpData;
data.infoData[XXX] = &(data._infoData[XXX]);


3.データの有無判定

前述の2のようにすれば
if( gMainData.infoData[XXX] == NULL){
}
でデータを代入済みかどうか判定できます。
もちろんデータを代入していないポインタがNULLであることが前提ですが。


・余談ですが、構造体のタグ名とtypedefする型名は同じでも大丈夫です。例えば

typedef struct info_t{
...
} info_t;

のように。

1.初期化
ループでもmemsetでもよいと思います。どれがベストかはケース・バイ・ケースでしょう。

ただしmemsetの第2引数はint型、第3引数はバイト数なので、次のようにするべきです。
memset(gMainData.infoData, 0, 100 * sizeof(info_t));

また、C言語の規格により static 変数を明示的に初期化しなければ全て 0 になるので
static gData_t iniData;
gData_t data;
と定義しておいて
data = iniData;
のように初期化する方法も(一応)あります。


2.データの代入

info_t *infoData[100] は構造体の配...続きを読む

QcharからLPTSTRへの変換方法

リストコントロールにchar型の変数の値を数値として表示させたいのですが、charからLPTSTRへの洗練された変換方法がよくわからないです。

char tempChar;
CString tempString;
tempString.Format("%s", tempChar);
LPTSTR lpsz = new TCHAR[tempString.GetLength()+1];
_tcscpy(lpsz, tempString);

こんなプログラムを考えてみたのですが、汚いような気がします。もっと簡単で洗練された変換方法はないのでしょうか?

Aベストアンサー

wsprintfを使ってはどうでしょうか?

char tmpChar = 100;//表示する数値
TCHAR buf[5];
wsprintf(buf, "%d", tempChar);

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ランキング