当前位置: 代码迷 >> C语言 >> [求助]这个C语言源程序哪有问题?int86中断控制
  详细解决方案

[求助]这个C语言源程序哪有问题?int86中断控制

热度:363   发布时间:2006-10-18 21:08:50.0
[求助]这个C语言源程序哪有问题?int86中断控制

下面这个程序是为了播放do、re、mi的音乐,并响应键盘跟鼠标的触发而停止,
但运行后发现音乐能持续播放,但不能停止,而且屏幕显示也不能按预想的实现
#include<stdio.h>
#include<conio.h> // kbhit()
#include<dos.h> // int86() sound() nosound()
#include<stdlib.h>

union REGS r;
union REGS Inr,Outr;
union REGS Ins,Outs;
int iMx=0,iMy=0;

void initgraph(int mode) // 初始化屏幕
{
r.h.ah=0;
r.h.al=mode;
int86(0x10,&r,&r);
}

void initmouse() //初始化鼠标
{
r.x.ax=0;
int86(0x33,&r,&r);
r.x.ax=1;
int86(0x33,&r,&r);
}

void getmouse() //读取鼠标状态
{
Inr.x.ax=3;
int86(0x33,&Inr,&Outr);
iMx=Outr.x.cx;
iMy=Outr.x.dx;
}

int mousestatus() //看鼠标位置是否移动
{
getmouse();
Ins.x.ax=3;
int86(0x33,&Ins,&Outs);
if(iMx!=Outs.x.cx||iMy!=Outs.x.dx)
return 1;
else
return 0;
}

main()
{
int i;
unsigned f[]={262,294,330};
initgraph(18); //设置屏幕为640*480图形模式
initmouse();
if((!kbhit())&&(!mousestatus()))
for(i=0;i<=3;i++) //do、re、mi的播放循环
{
if(i==3) i=0;
sound(f[i]);
sleep(1);
nosound();
}
}

搜索更多相关的解决方案: C语言  

----------------解决方案--------------------------------------------------------

改进程序啊,在TC2.0下调试成功啦,不过在Borland C++上就不行,不知道怎么回事啊
#include<stdio.h>
#include<conio.h> // kbhit()
#include<dos.h> // int86() sound() nosound()
#include<stdlib.h>

union REGS r;
union REGS Inr,Outr;

void initmouse()
{
r.x.ax=0;
int86(0x33,&r,&r);
r.x.ax=2;
int86(0x33,&r,&r);
}

int readmouse(int *iMx,int *iMy,int *status)
{
Inr.x.ax=3;
int86(0x33,&Inr,&Outr);
*iMx=Outr.x.cx;
*iMy=Outr.x.dx;
*status=Outr.x.bx;
}

main()
{
int i;
int iMx1=0,iMy1=0,status1=0;
int iMx2=0,iMy2=0,status2=0;
unsigned f[]={262,294,330};
initmouse();
readmouse(&iMx1,&iMy1,&status1);
for(i=0;i<=3;i++)
{
if(!kbhit())
{
if(i==3) i=0;
sound(f[i]);
sleep(1);
nosound();
readmouse(&iMx2,&iMy2,&status2);
if((iMx1!=iMx2)||(iMy1!=iMy2)||(status2&1)||(status2&2))
break;
}
}
}


----------------解决方案--------------------------------------------------------
  相关解决方案