void Show_BMP(unsigned int Width,unsigned int Height)
{
unsigned long int position;
position=0x4d200+0x3e+Width/7+Height*408;
...
...
}
以上程序的写法绝对没有任何语法错误!!Code VisionAVR编译的时候也不会报错,但是它却有一个致命的缺陷,就是在这里"Height*408"!!
因为,虽然position是unsigned long int型的,大小绝对能容下后面的数据,但是Height却是unsigned int型的,在编译的时候,因为一般code visionAVR都是开了优化选项的,所以它会认为Height*408依然是一个unsigned int型,结果就是当Height超过了0XA1后,程序就绝对出错了,虽然前面的position是unsigned long int型,但是这里的运算依然会出错。而且,就算改成以下写法,也依然会出错的:
position=(unsigned long int)(0x4d200+0x3e+Width/7+Height*408);
必须改成这个样子的才对:
position=0x4d200+0x3e+Width/7+(unsigned long int)Height*408;
C数据类型道理上应该遵循向上靠原则,Height是int的,那么运算时候应该是按照long计算的,结果也是long型的.
cv计算很奇怪,但是最好养成一个数据类型强制转换习惯吧!
看看下面的计算(cv中的):
int c = (char a) * 200 + (char b) * 512;
这个结果很可能出错,请注意!
错误原因在这里:(char a) * 200 ,cv认为既然都是char的,那么他就认为结果也是char的,但是如果刚好两个char的:100 *100 = 10000就溢出了,cv就把结果转换成char的,结果是0,显然错误.但是如果这样:8 * 6 + (char b) * 512;结果就正确了.
这个式子:(char b) * 512; 有个512存在,cv就按照int进行计算,结果保留成int,结果正确.
正确的如下:
int c = (int)(char a) * 200 + (char b) * 512;
并且在cv的user manual中有乘法计算注意事项,就说的是这个,要求用户手动强制转换,建议用cv的还是要好好看看datasheet
详情回复
发表于 2008-6-17 10:21