| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 923 人关注过本帖
标题:[求助]关于mempoint(x,y,color)中几点不懂得地方,请指教!
只看楼主 加入收藏
realove
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2006-6-8
收藏
 问题点数:0 回复次数:12 
[求助]关于mempoint(x,y,color)中几点不懂得地方,请指教!

基本算法我可以看懂:通过传入的x,y,color,寻找像素点在内存中的位置。
我的疑问:
1。320*200的分辨率,在if(x<0||x>199||y<0||y>319),是不是x&y搞反了???
2。bitmask.c[0]是什么东西,为什么没有初始化?
3。if(!xor),干吗不直接用t=*(ptr+index)||11<<2*(3-positon);//position2位被置为11,*(ptr+index)=t&color_code?,
如果按他这种描述方法,应该先将position两位设为00,然后或上颜色码。
那么为什么看不到bitmask.c[0]的初始化值啊???比如颜色码是10,y%4=2,bitmask.c[0]应该是32,他为什么没有赋值。


源程序
/*mempoint(int x,int y,int color_code)*/
void mempoint(int x,int y,int color_code)
{
union mask{
char c[2];
int i;
}bit_mask;
int i,index,bit_position;
unsigned char t;
char xor;
char far *ptr=(char far*)0xB8000000;
bit_mask.i=0xFF3F;
if(y<0||y>319||x<0||x>199)return;
xor=color_code&128;
color_code=color_code&127;
bit_position=y%4;
color_code<<=2*(3-bit_position);
bit_mask.i=2*bit_position;
index=x*40+y/4;
if(x%2)index+=8192;
if(!xor){
t=*(ptr+index)&bit_mask.c[0];
t=*(ptr+index)|color_code;
}else{
t=*(ptr+index)|(char)0;
*(ptr+index)=t|color_code;
}

}
/*over*/

[此贴子已经被作者于2006-9-3 15:17:45编辑过]

搜索更多相关主题的帖子: mempoint color 指教 
2006-09-03 14:46
soft_wind
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:1430
专家分:0
注 册:2006-4-5
收藏
得分:0 
以下是引用realove在2006-9-3 14:46:56的发言:

基本算法我可以看懂:通过传入的x,y,color,寻找像素点在内存中的位置。
我的疑问:
1。320*200的分辨率,在if(x<0||x>199||y<0||y>319),是不是x&y搞反了???
2。bitmask.c[0]是什么东西,为什么没有初始化?
3。if(!xor),干吗不直接用t=*(ptr+index)||11<<2*(3-positon);//position2位被置为11,*(ptr+index)=t&color_code?,
如果按他这种描述方法,应该先将position两位设为00,然后或上颜色码。
那么为什么看不到bitmask.c[0]的初始化值啊???
4。还有那个bitmask.i的作用我也有点不懂啊!

请指点!


源程序
/*mempoint(int x,int y,int color_code)*/
void mempoint(int x,int y,int color_code)
{
union mask{
char c[2];
int i;
}bit_mask;
int i,index,bit_position;
unsigned char t;
char xor;
char far *ptr=(char far*)0xB8000000;
bit_mask.i=0xFF3F;
if(y<0||y>319||x<0||x>199)return;
xor=color_code&128;
color_code=color_code&127;
bit_position=y%4;
color_code<<=2*(3-bit_position);
bit_mask.i=2*bit_position;
index=x*40+y/4;
if(x%2)index+=8192;
if(!xor){
t=*(ptr+index)&bit_mask.c[0];
t=*(ptr+index)|color_code;
}else{
t=*(ptr+index)|(char)0;
*(ptr+index)=t|color_code;
}

}
/*over*/

太过专业的东西,让大家帮您看有些困难。我只能就这程序的结构回答您的问题,也许帮不到您
1.您说的有理,我也觉得x,y写反了,不过这个我也不肯定,您可以到C图形专区再问问;
2.bitmask.c[0]是共用体bit_mask的低8位.c[1]是高8位.它们已经通过bit_mask.i=0xff3f;来初始化了,通过对c[0],c[1]来对bit_mask的高8位和低8位进行操作。
3.只有在color_code的第8bit是1时才进行{}的位操作.不然进行另外操作。具体是怎么回事,我看得懂也说不来它的意思
4.已经包含在2中。
另:这个函数是利用共用体对变量共用内存来操作的。


对不礼貌的女生收钱......
2006-09-03 15:16
soft_wind
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:1430
专家分:0
注 册:2006-4-5
收藏
得分:0 

对于一个共用体:
union
{
type1 var1;
type2 var2;
.....
typen varn;
};
这里面的内存都是共用的,也就是说内存为max(sizeof(var1),sizeof(var2),...,sizeof(varn));
而且C语言规定,共用体采用与开始地址对齐的方式分配地址空间。比如:
union
{
int a;
float b;
}
a占用的b的前两个字节,而不是后两个。


对不礼貌的女生收钱......
2006-09-03 15:20
realove
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2006-6-8
收藏
得分:0 
哦,谢谢你啊,共用体是里边变量共用相同的内存,这个很好!
2006-09-03 15:30
realove
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2006-6-8
收藏
得分:0 
哦,
2006-09-03 15:31
realove
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2006-6-8
收藏
得分:0 
数组分配的时候,不是从低地址到高地址吗?
是不是在共用体中有所不同?
c[0]是高8位?
2006-09-03 15:38
realove
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2006-6-8
收藏
得分:0 
如果是这样,那么第二次
bit_mask.i=2*bit_position,
就没有改变c[0]的值,这样*(ptr+index)&bit_mask.c[0],好像没有什么意义拉
2006-09-03 15:42
realove
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2006-6-8
收藏
得分:0 
以下是引用realove在2006-9-3 15:42:44的发言:
如果是这样,那么第二次
bit_mask.i=2*bit_position,
就没有改变c[0]的值,这样*(ptr+index)&bit_mask.c[0],好像没有什么意义拉

哦,看错了,原来有是bit_mask.i>>=2*bit_position,这样正好,可以把原来的位置零,
对你是对了,太谢谢啦!

2006-09-03 15:56
soft_wind
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:1430
专家分:0
注 册:2006-4-5
收藏
得分:0 
以下是引用realove在2006-9-3 15:38:21的发言:
数组分配的时候,不是从低地址到高地址吗?
是不是在共用体中有所不同?
c[0]是高8位?

是低8位.不过这个我也讲不清.
我用这个程序验证的,也许数组的空间分配规则不一样也不一定。
#include<stdio.h>
#include <conio.h>
union mask{
char c[2];
int i;
}bit_mask;
void main()
{

bit_mask.i=256;
printf("%d%d",bit_mask.c[0],bit_mask.c[1]);
getch();
}
如果c[0]是高8位,显示的应该是10,而实际上显示的01.
期待高手回复....


对不礼貌的女生收钱......
2006-09-03 15:58
soft_wind
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:1430
专家分:0
注 册:2006-4-5
收藏
得分:0 
以下是引用realove在2006-9-3 15:56:25的发言:

哦,看错了,原来有是bit_mask.i>>=2*bit_position,这样正好,可以把原来的位置零,
对你是对了,太谢谢啦!

其实这个我也不懂,您的问题问得太过专业,或者是我的知识太过浅薄,
其实您这个函数我还是半知不解的,我只能从语法来分析,真正意义我是不懂的.


对不礼貌的女生收钱......
2006-09-03 16:01
快速回复:[求助]关于mempoint(x,y,color)中几点不懂得地方,请指教!
数据加载中...
 
   



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

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