プロが教える店舗&オフィスのセキュリティ対策術

ファイルの文字列を1行ずつ読み込み、文字列の数字の範囲によって再生する音楽を変えるプログラムを作成していますが、読み込んだ文字列とは無関係に、ループの初めの範囲で指定してある音楽しか再生されません。読み込んだ文字列ごとに再生音楽を変えるにはどうすればいいのでしょうか?分かる方ご教授願います。

環境:WindowsXP, Visual C++ 2008 Express Edition
以下がプログラムのソースの一部です。

LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
FILE *fp;
errno_t err;
TCHAR buf[30];
TCHAR *temp;
int m=0, n=0;

switch(msg)
{
case WM_CREATE:
CreateWindow(TEXT("BUTTON"), TEXT("Play"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,120, 100, 70, 70, hWnd, NULL, hInst, NULL);
break;
case WM_COMMAND:
err = _tfopen_s(&fp, TEXT("C:\\Documents and Settings\\m22015\\My Documents\\Visual Studio 2008\\Projects\\process\\process\\Corner.txt"), TEXT("r+"));
if(err != 0)
break;
temp = (TCHAR*)malloc(_tcsclen(buf)+1);
if(temp == NULL){
MessageBox(hWnd, TEXT("Can't secure of memory"), TEXT("Error"), MB_OK);
break;
}
for(int i=0; i<2; i++){
_fgetts(buf, 10, fp);
_tcstok(buf, TEXT("\n"));
}
while(_fgetts(buf, 30, fp) != NULL){
_tcstok(buf, TEXT("\n"));
_tcscpy(temp, buf);
while(_stprintf(buf, _T("- { x:%d, y:%d }"), m, n)!=EOF){
if((m>=0 && m<110)&&(n>=0 && n<200)){
if(mciSendString(_T("play C+1.mid"), NULL, 0, NULL) != 0)
{
MessageBox(hWnd, _T("Can't play C+1.mid"), _T("Error"), MB_OK);
SendMessage(hWnd, WM_CLOSE, 0, 0);
}
return 0;
}else if((m>=110 && m<220)&&(n>=0 && n<200)){
if(mciSendString(_T("play D+1.mid"), NULL, 0, NULL) != 0)
{
MessageBox(hWnd, _T("Can't play D+1.mid"), _T("Error"), MB_OK);
SendMessage(hWnd, WM_CLOSE, 0, 0);
}
return 0;
}else if((m>=220 && m<330)&&(n>=0 && n<200)){
if(mciSendString(_T("play E+1.mid"), NULL, 0, NULL) != 0)
{
MessageBox(hWnd, _T("Can't play E+1.mid"), _T("Error"), MB_OK);
SendMessage(hWnd, WM_CLOSE, 0, 0);
}
return 0;
}else if((m>=330 && m<440)&&(n>=0 && n<200)){
if(mciSendString(_T("play F+1.mid"), NULL, 0, NULL) != 0)
{
MessageBox(hWnd, _T("Can't play F+1.mid"), _T("Error"), MB_OK);
SendMessage(hWnd, WM_CLOSE, 0, 0);
}
return 0;
}else if((m>=440 && m<550)&&(n>=0 && n<200)){
if(mciSendString(_T("play G+1.mid"), NULL, 0, NULL) != 0)
{
MessageBox(hWnd, _T("Can't play G+1.mid"), _T("Error"), MB_OK);
SendMessage(hWnd, WM_CLOSE, 0, 0);
}
return 0;
}else if((m>=550 && m<660)&&(n>=0 && n<200)){
if(mciSendString(_T("play A+1.mid"), NULL, 0, NULL) != 0)
{
MessageBox(hWnd, _T("Can't play A+1.mid"), _T("Error"), MB_OK);
SendMessage(hWnd, WM_CLOSE, 0, 0);
}
return 0;
}else if((m>=660 && m<770)&&(n>=0 && n<200)){
if(mciSendString(_T("play B+1.mid"), NULL, 0, NULL) != 0)
{
MessageBox(hWnd, _T("Can't play B+1.mid"), _T("Error"), MB_OK);
SendMessage(hWnd, WM_CLOSE, 0, 0);
}
return 0;
}else if(mciSendString(_T("play C.mid"), NULL, 0, NULL) != 0)
{
MessageBox(hWnd, _T("Can't play C.mid"), _T("Error"), MB_OK);
SendMessage(hWnd, WM_CLOSE, 0, 0);
}
return 0;
}else if((m>=110 && m<220)&&(n>=200 && n<400)){
if(mciSendString(_T("play D.mid"), NULL, 0, NULL) != 0)
{
MessageBox(hWnd, _T("Can't play D.mid"), _T("Error"), MB_OK);
SendMessage(hWnd, WM_CLOSE, 0, 0);
}
return 0;
以下省略
.
.
.
}else{
break;
}
}
}
free(temp);
fclose(fp);
break;
case WM_CLOSE:
DestroyWindow(hWnd);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return (DefWindowProc(hWnd, msg, wParam, lParam));
}
return 0;
}

A 回答 (1件)

>読み込んだ文字列とは無関係に、ループの初めの範囲で指定してある音楽しか再生されません。


>読み込んだ文字列ごとに再生音楽を変えるにはどうすればいいのでしょうか?

 読み込んだ「文字列」を、範囲指定で用いている? m n へ「関係」付けている部分が見あたりませんが・・???

 文字列の仕様と、「関係」付けている部分(「以下省略」部分?)を補足していただければ、「回答」がつくと思われます。
+++++++++++++++++++++++++++++++++++++++
現状では、
 ・読み込まれる文字列をテーブル化し、m n と関係付ける。
 ・文字列に「数」が2つ、そのものズバリ含まれるのなら、数値化する関数( atoi() 等)を用い m n へ代入する。
としか・・。

蛇足

if((m>=0 && m<110)&&(n>=0 && n<200)){
   ・(略)
return 0;
}else if((m>=110 && m<220)&&(n>=0 && n<200)){
   ・(略)
   ・(略)
return 0;
}else if((m>=660 && m<770)&&(n>=0 && n<200)){
   ・(略)
return 0;
}
この50行は、( m n は負ではないと仮定)

 ・char cTitle[ 8 ] = { "CDEFGAB" }; と異なる部分を配列にし、
 ・共通部分( n >= 0 && n < 200 )を大外に、

   if( n < 200 ){

     for( i = 0; i < 7; i++ ){

       if( m < ( 110 * ( 1 + i ) ) ){ // 110,220,330,・・770

         ・(略:メッセージ?文字列作成等)

         return( 0 );
       }
     }
   }
  と簡略化できますよ。もちろん else 「なんて」そもそもから不要です。
    • good
    • 0
この回答へのお礼

遅くなりましたが、回答ありがとうございます。
ファイルは
%YAML:1.0
- { x:476, y:36 }
- { x:789, y:121 }
- { x:546, y:61 }
- { x:109, y:300 }
- { x:560, y:87 }
- { x:462, y:20 }
    ・
    ・
    ・
のようになっています。
数値の変化するごとに、mとnで範囲を指定した音楽を再生させたいと考えているのですが・・・。

あと、訂正ですが
while(_stprintf(buf, _T("- { x:%d, y:%d }"), m, n)!=EOF){
ではなくて、
while(_stscanf(buf, _T("- { x:%d, y:%d }"), m, n)!=EOF){
です(>_<;)
ごめんなさい。


if-elseは簡略化できるんですね!ありがとうございます!!

お礼日時:2009/01/11 16:44

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