当前位置: 代码迷 >> C语言 >> [求助]关于mempoint(x,y,color)中几点不懂得地方,请指教!
  详细解决方案

[求助]关于mempoint(x,y,color)中几点不懂得地方,请指教!

热度:422   发布时间:2006-09-03 14:46:56.0
[求助]关于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  指教  

----------------解决方案--------------------------------------------------------
以下是引用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中。
另:这个函数是利用共用体对变量共用内存来操作的。


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

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


----------------解决方案--------------------------------------------------------
哦,谢谢你啊,共用体是里边变量共用相同的内存,这个很好!

----------------解决方案--------------------------------------------------------
哦,
----------------解决方案--------------------------------------------------------
数组分配的时候,不是从低地址到高地址吗?
是不是在共用体中有所不同?
c[0]是高8位?
----------------解决方案--------------------------------------------------------
如果是这样,那么第二次
bit_mask.i=2*bit_position,
就没有改变c[0]的值,这样*(ptr+index)&bit_mask.c[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,这样正好,可以把原来的位置零,
对你是对了,太谢谢啦!
----------------解决方案--------------------------------------------------------

以下是引用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.
期待高手回复....
----------------解决方案--------------------------------------------------------

以下是引用realove在2006-9-3 15:56:25的发言:

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

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


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