广告广告
  加入我的最爱 设为首页 风格修改
首页 首尾
 手机版   订阅   地图  繁体 
您是第 2805 个阅读者
 
发表文章 发表投票 回覆文章
  可列印版   加为IE收藏   收藏主题   上一主题 | 下一主题   
aniegg
数位造型
个人文章 个人相簿 个人日记 个人地图
初露锋芒
级别: 初露锋芒 该用户目前不上站
推文 x0 鲜花 x26
分享: 转寄此文章 Facebook Plurk Twitter 复制连结到剪贴簿 转换为繁体 转换为简体 载入图片
推文 x0
[C#] while loop问题--part3
经过一天的修改,我的程式已经接近完成,
剩下最后一个bug还没解决--按ESC键离开程式。

问题描述:

我在while loop里,加入:
if ( kbhit() ) {
if ( getch() == 27 )
break;
}
目的是当然是想按ESC键结束程式,但是却无法达到目的,程式依然继续执行while loop。

程式码:
#include <stdio.h>
#include <dos.h ..

访客只能看到部份内容,免费 加入会员 或由脸书 Google 可以看到全部内容



飒风沾、问途寒,谁与共饮,谁敢挡关?
燕戟归命人不还。
献花 x0 回到顶端 [楼 主] From:台湾 | Posted:2005-10-02 22:22 |
youchun
数位造型
个人文章 个人相簿 个人日记 个人地图
小人物
级别: 小人物 该用户目前不上站
推文 x0 鲜花 x26
分享: 转寄此文章 Facebook Plurk Twitter 复制连结到剪贴簿 转换为繁体 转换为简体 载入图片

我猜是因为中断而引发的问题
试试看 if (code == <ESC scancode>) break;
先找出 <ESC scancode>
不保证有效果..


献花 x0 回到顶端 [1 楼] From:台湾中华电信 | Posted:2005-10-02 23:02 |
cmovies
数位造型
个人文章 个人相簿 个人日记 个人地图
小人物
级别: 小人物 该用户目前不上站
推文 x0 鲜花 x20
分享: 转寄此文章 Facebook Plurk Twitter 复制连结到剪贴簿 转换为繁体 转换为简体 载入图片

为何在 int_0x09 不呼叫 oldfunc ???
还有程式结束后应该要把 interrupt 09 还回来吧? 不然结束后不会当机或不能按键吗?
如果真的不想再 int_0x09 中呼叫 oldfunc, 那就应该照 youchun 的建议修改应该就可以了!
ESC scancode 好像是 01h 还是 76h? 你可以试看看!


献花 x0 回到顶端 [2 楼] From:未知地址 | Posted:2005-10-02 23:35 |
aniegg
数位造型
个人文章 个人相簿 个人日记 个人地图
初露锋芒
级别: 初露锋芒 该用户目前不上站
推文 x0 鲜花 x26
分享: 转寄此文章 Facebook Plurk Twitter 复制连结到剪贴簿 转换为繁体 转换为简体 载入图片

感谢大大,
程式已经没问题了,
不过我还是很纳闷,
我抓到ESC的scan code有两个,分别是1跟81
但是只有1这个值可以让我结束程式,而81却不能,
到底时什么原因,请大大说明一下,谢谢!


飒风沾、问途寒,谁与共饮,谁敢挡关?
燕戟归命人不还。
献花 x0 回到顶端 [3 楼] From:台湾 | Posted:2005-10-02 23:38 |
cmovies
数位造型
个人文章 个人相簿 个人日记 个人地图
小人物
级别: 小人物 该用户目前不上站
推文 x0 鲜花 x20
分享: 转寄此文章 Facebook Plurk Twitter 复制连结到剪贴簿 转换为繁体 转换为简体 载入图片

81h 是按键放开码, 应该 01h 跟 81h 都可以.
你该不会直接写 81 而不是 0x81 吧!?


献花 x0 回到顶端 [4 楼] From:未知地址 | Posted:2005-10-02 23:45 |
aniegg
数位造型
个人文章 个人相簿 个人日记 个人地图
初露锋芒
级别: 初露锋芒 该用户目前不上站
推文 x0 鲜花 x26
分享: 转寄此文章 Facebook Plurk Twitter 复制连结到剪贴簿 转换为繁体 转换为简体 载入图片

我直接用
      if( code==1 )
        break;
就可以成功使用ESC键离开程式了,
下面是我最后的程式码,



#include <stdio.h>
#include <dos.h>
#include <conio.h>

int code, count = 0, key;

void interrupt int_0x09();
void interrupt (*oldfunc)();

void interrupt int_0x09()
{
  count++;
  key = key+50;
  code=inportb(0x60);
  sound(key);
  delay(50);
  nosound();
  outportb( 0x20, 0x20 );
}

main()
{
  clrscr ();
  oldfunc=getvect(0x09);

  printf( "Test keyboard interrupt (0x09) \n\n" );

  key=getch ();

  setvect (0x09, int_0x09);

  while ( count < 30 )
  {
      printf( "The character is entered, scan code = %x\n", code );

      delay(500);

      if( code==1 )
        break;
  }

  setvect(0x09,oldfunc);

  return 0;
}


飒风沾、问途寒,谁与共饮,谁敢挡关?
燕戟归命人不还。
献花 x0 回到顶端 [5 楼] From:台湾 | Posted:2005-10-02 23:57 |
cmovies
数位造型
个人文章 个人相簿 个人日记 个人地图
小人物
级别: 小人物 该用户目前不上站
推文 x0 鲜花 x20
分享: 转寄此文章 Facebook Plurk Twitter 复制连结到剪贴簿 转换为繁体 转换为简体 载入图片

请问 delay(500) 的目的为何? 有时候按键太快应该也会 lost 按键显示吧?
还有如果没按键不是也会每半秒出现一次 "The character is entered, scan code = .." 吗?
你应该可以加一个 ReadyFlag 在 int_0x09 中设为 1
然后主程式改成 (因为按键不会很快, 所以不考虑 ReadyFlag 同时被设定的问题)
whlie (count < 30)
{
  if (ReadyFlag)
  {
    ReadyFlag = 0;
    printf( "The character is entered, scan code = %x\n", code );
    if (code==0x81) // 等 ESC 放开后再离开
    break;
  }
}


献花 x0 回到顶端 [6 楼] From:未知地址 | Posted:2005-10-03 00:17 |
aniegg
数位造型
个人文章 个人相簿 个人日记 个人地图
初露锋芒
级别: 初露锋芒 该用户目前不上站
推文 x0 鲜花 x26
分享: 转寄此文章 Facebook Plurk Twitter 复制连结到剪贴簿 转换为繁体 转换为简体 载入图片

你是指
void interrupt int_0x09()
{
count++;
ReadyFlag=1;
key = key+50;
code=inportb(0x60);
sound(key);
delay(50);
nosound();
outportb( 0x20, 0x20 );
}

这样会出现错误讯息:Undifined symbol 'ReadyFlag'


飒风沾、问途寒,谁与共饮,谁敢挡关?
燕戟归命人不还。
献花 x0 回到顶端 [7 楼] From:台湾 | Posted:2005-10-03 01:06 |
cmovies
数位造型
个人文章 个人相簿 个人日记 个人地图
小人物
级别: 小人物 该用户目前不上站
推文 x0 鲜花 x20
分享: 转寄此文章 Facebook Plurk Twitter 复制连结到剪贴簿 转换为繁体 转换为简体 载入图片

在程式最上面加一个变数, 如
int code, count = 0, key, ReadyFlag=0;


献花 x0 回到顶端 [8 楼] From:未知地址 | Posted:2005-10-03 01:10 |

首页  发表文章 发表投票 回覆文章
Powered by PHPWind v1.3.6
Copyright © 2003-04 PHPWind
Processed in 0.067222 second(s),query:16 Gzip disabled
本站由 瀛睿律师事务所 担任常年法律顾问 | 免责声明 | 本网站已依台湾网站内容分级规定处理 | 连络我们 | 访客留言