|
|
|
| 从奇数地址读short类型引起的错误 |
编辑:evzhy 审核:rocks 文章来源:CNJM论坛精华
关键词:无 发表日期:2003-09-24 14:34:58 浏览次数:4225次 |
|
|
|
|
本文版权归原作者,中国JAVA手机网收录本文的目的是让更多人阅读到此文章。转载请注明出处为中国JAVA手机网<www.cnjm.net>
来自:http://www.cnjm.net/tech/article763.html bug表现: 模拟器上没问题,但是手机上level 5背景凌乱,其他level都是好的,唯有level 5的背景有问题,有的区域是对的,有的就是错的,好像马赛克,仔细观察,是深颜色的宫殿的tile,但是却显示在浅颜色的雪地上,斑驳陆离,好像一个后现代图画。
JAVA手机网[www.cnjm.net] 分析:
JAVA手机网[www.cnjm.net] 因为模拟器上没问题,手机上却有问题,所以要找出两者运行中开始不同的地方。 经过分析跟踪,集中到一段代码,它打开压缩的资源数据文件, 读入内存,跳过一定的字节,这里就是level 5的block的tile索引数据,把这段数据复制到局部内存中. 打印全部解压数据在内存中的字节和,手机上和模拟器上相等, 打印level 5的block的tile索引数据的字节和,手机和模拟器上不相等, 打印level 5的block的tile索引数据的起始地址,手机模拟器相等, 打印level 5的block的tile索引数据的个数,相等, 这说明从压缩文件中解压读入内存的数据是正确的,复制个数是正确的,复制开始的位置也是正确的,那为什么简单的复制之后就是错误的? 打印复制开始的地址,是奇数。 问题就在这里。 修改: 原程序中的函数 unsigned short Reader_readWord(READER *pReader)
JAVA手机网[www.cnjm.net] { return *((unsigned short*)pReader->pCur)++; }
JAVA手机网[www.cnjm.net] pReader->pCur指向奇数地址,是否会有问题? 加入判断,如果是奇数地址,就分别读2个字节,装配成short。 问题解决。 结论: 从奇数字节开始读short等类型的数据,在手机上可能引起问题。 思考: 为什么从奇数字节读short就可能出错,并且有的数据读出来正确,有的读出来不正确,具体的机制是什么?是否和arm c的编译开关选项有关?还是和手机有关?
来自:http://www.cnjm.net/tech/article763.html
|
|
|
|
|
|
相关文章
暂无相关文章
|
|
| 最新评论
|
| 匿名 在 2006-05-11 16:17:29 发表的评论: |
| 扯淡 |
| evzhy 在 2003-09-25 12:59:06 发表的评论: |
| 哇赛,你真是个c高手啊,比我写的效率高,拿来主义了,嘻嘻 |
| luoyizhou 在 2003-09-25 12:17:25 发表的评论: |
我也想知道为什么,我记得把奇地址当作int指针进行操作会导致黑屏,同事的经验 :),我们就规定数据输出是加PAD保证整型数据从偶地址开始. 当然函数也可以改成 unsigned short Reader_readWord(READER *pReader) { short ret; char* d = (char*)&ret; *d++=pReader->pCur++; *d++=pReader->pCur++; return ret; } 不知道效率会不会变低点. |
|
|
|