| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1369 人关注过本帖
标题:tc中if函数和setactivepage函数不能在一起用??
只看楼主 加入收藏
xuesuyu
Rank: 1
等 级:新手上路
帖 子:27
专家分:0
注 册:2006-9-10
收藏
 问题点数:0 回复次数:8 
tc中if函数和setactivepage函数不能在一起用??

看下面的程序 我本想输出一个 大圆小圆交替出现的画面
结果却黑洞洞 什么都没 如果把 if函数去掉的话 才可以显示东西 但是又不能达到我原来的目的 难道IF函数不能和setactivepage函数一起用??
#include<stdio.h>
#include<graphics.h>
#include<dos.h>
#include<conio.h>
void main()
{ int gdriver=DETECT,gmode=VGAMED;int i;
initgraph(&gdriver,&gmode,"f:\\turboc2");
for(i=2;i<10;i++)
{ setactivepage(0);
{if(i/2==0)
circle(200,200,200);
if(i/2==0)
circle(200,200,100);
}
setvisualpage(0);
sleep(1);
}
}



搜索更多相关主题的帖子: if函数 include int gdriver gmode 
2006-09-11 00:46
一笔苍穹
Rank: 1
等 级:新手上路
帖 子:640
专家分:0
注 册:2006-5-25
收藏
得分:0 
楼主刚刚学C语言的吧?if可不是函数,它是关键字,概念不能混淆了。
if是用来作逻辑判断的,在你上面这个程序中,if被用来判定i/2(i除以2)是否等于0,如果等于0(表达示为真)就执行if下面的画圆函数,不等于就跳过不管。而i的范围在上面的for循环(同样的的,for也是关键字)中已经指定,即从2到9,每循环一次递增1,问题就出在不管是2还是3…还是到9,里面没有一个数除以2会等于0的,所以if中的表达式就一直不成立(为假),也就不会执行其下的画圆函数了。
你可试试将if(i/2==0)改为if(i/2==1)。
2006-09-11 10:00
xuesuyu
Rank: 1
等 级:新手上路
帖 子:27
专家分:0
注 册:2006-9-10
收藏
得分:0 
我的确是个C的初学者
不好意思 昨天我半夜头晕晕的 现在将错误的地方改出来了(红色的)改过错后就能行了 我打错了 里面的i/2 应该是i%2 我把求余和除弄错了~2楼的 再问个问题行不?在头文件graphics.h中 模式 VGAMED后面有个2pages VGAHI后面有个1page 他们分别是什么意思??
#include<stdio.h>
#include<graphics.h>
#include<dos.h>
#include<conio.h>
void main()
{ int gdriver=DETECT,gmode=VGAMED;int i;
initgraph(&gdriver,&gmode,"f:\\turboc2");
for(i=2;i<10;i++)
{ setactivepage(0);
{if(i%2==0)
circle(200,200,200);
if(i%2==1)
circle(200,200,100);
}
setvisualpage(0);
sleep(1);
cleardevice();
}
}

[此贴子已经被作者于2006-9-11 12:42:16编辑过]


2006-09-11 12:40
一笔苍穹
Rank: 1
等 级:新手上路
帖 子:640
专家分:0
注 册:2006-5-25
收藏
得分:0 
就是在这个模式下能使用的页数,你代码里的setactivepage()和setvisualpage()使用的就是页。
2006-09-11 12:55
xuesuyu
Rank: 1
等 级:新手上路
帖 子:27
专家分:0
注 册:2006-9-10
收藏
得分:0 

刚开始我也是这么想的 但是 很奇怪了 我在VGAHI模式下照样把setactivepage()的参数设置 为0 和1 照样能用 看下面的小程序
问题1 未添上红色的部分的时候会有大小圆同时出现的现象 如果不添加上cleardevice和clearviewport应该怎么办?
问题2 添上cleardevice()后只一次只会出现1个圆 但是效果很不好 某个圆还会被遮住一小块 远不如3楼的那个只把页数设置为0的好 这是为什么?
#include<stdio.h>
#include<graphics.h>
#include<dos.h>
#include<conio.h>
void main()
{ int gdriver=DETECT,gmode=VGAHI;int i,p=1;
initgraph(&gdriver,&gmode,"f:\\turboc2");

for(i=0;i<10;i++)
{ if(p==1) cleardevice();/*本来没有后来添上*/
if(p==1)
{ setactivepage(0); /*页数为0*/
circle(300,240,200);}
if(p==0) cleardevice();/*同上*/
if(p==0)
{ setactivepage(1); /*页数为1*/
circle(300,240,100);}

setvisualpage(p=(p==1)?0:1);
sleep(1);

}

getch();
}




2006-09-11 13:29
RockCarry
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:13
帖 子:662
专家分:58
注 册:2005-8-5
收藏
得分:0 
setactivepage和setvisualpage好像只能使用在VGALO和VGAMED视频模式下,如下:
VGALO = 0, /* 640x200 16 color 4 pages */
VGAMED = 1, /* 640x350 16 color 2 pages */
VGAHI = 2, /* 640x480 16 color 1 page */
这个是graphics.h中找到的,自己去看看吧。
如果是第三方BGI的话,就要参考其文档了。

VGAHI模式下只有一个页面,所以没有办法换页,因此以上两个函数就没有什么用了。
页面编号是从0开始的,记住。一般的要判断页面号是否正确:
#define TOTAL_PAGE_NUM 1
int pagenum = 0;
assert(pagenum>=0 && pagenum<TOTAL_PAGE_NUM );
setactivepage(pagenum);

[此贴子已经被作者于2006-9-11 16:08:06编辑过]

2006-09-11 15:43
RockCarry
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:13
帖 子:662
专家分:58
注 册:2005-8-5
收藏
得分:0 
这两个函数的使用流程如下:
setactivepage(0); // 选择第0个页面作为当前绘图页面
Draw1(); // 在0号页面上绘图
setactivepage(1); // 选择第1个页面作为当前绘图页面
Draw2(); // 在1号页面上绘图

int pagenum = 0;
while (!kbhit()) // 在两个页面之间不停交换
{
setvisualpage(pagenum);
pagenum ++;
pagenum %= 2;
delay(sometime);
}

你在使用方法上有问题。这两个函数所提供的功能类似于DirectDraw的换页功能。
以下的代码可以用于在后台页面绘制,然后再显示:
#define TOTAL_PAGE_NUM 2
int pagenum = 0;
while (!kbhit()) // 在两个页面之间不停交换
{
setvisualpage(pagenum); // 设置可视页面
pagenum ++;
pagenum %= TOTAL_PAGE_NUM;
setactivepage(pagenum); // 设置当前绘图页面为后台页面
Draw3(); // 在后台页面上绘图
delay(sometime);
}



[此贴子已经被作者于2006-9-11 16:00:42编辑过]

2006-09-11 15:59
xuesuyu
Rank: 1
等 级:新手上路
帖 子:27
专家分:0
注 册:2006-9-10
收藏
得分:0 
我把graphics.h中的东西看过了 但是 5楼的那个程序在VGAHI中照样能运行~
还有3楼的那个程序 也能运行 你比较运行一下这2个程序 看看 5楼的那个为什么比较差?找不到原因

2006-09-11 16:00
RockCarry
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:13
帖 子:662
专家分:58
注 册:2005-8-5
收藏
得分:0 
我已经讲得很明确,VGAHI中只有一个页面,你调用
setvisualpage(1);
必然会出错。因为所提供给你的接口就是这样定义的,所以不需要问为什么,当然更不能这样写代码。
不这样写代码了,自然就没有这些问题,也就没有烦恼了。
首先要理解平台,然后你才能更好的使用它。
2006-09-11 16:20
快速回复:tc中if函数和setactivepage函数不能在一起用??
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.044971 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved