5625|12

65

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

RETAILMSG() 函数的一个疑惑 [复制链接]

问题出处:
http://topic.eeworld.net/u/20090324/08/6d13fa10-a840-4f53-8b63-3b58bd5ddbbd.html?seed=11119132

本人在做WinCE5.0的OV9650摄像头抓拍小项目时,发现一个问题啊,手头上在CE4.2和CE5.0这两个版本的Camera驱动中,在camera.cpp文件中的CIS_IOControl()函数中,在case CAM_IOCTL_SAMSUNG_PREVIEW_START、case CAM_IOCTL_SAMSUNG_PREVIEW_STOP的分支中,都有这么一个极大的错误语句:

RETAILMSG(MSG_EN_1,(_T("CAM_IOCTL_SAMSUNG_PREVIEW_START(%x)\r\n"),*pBufOut, DRIVER_PREVIEW_ENABLE))

前头的输出参数之调用一个,后头的输出参数表就有两个!
编译时有没有出错,到时应用软件一调用,就TMD的就会无情的提示“Data Abort:”,造成崩溃!

那为啥在Platform Builder 5.0中编译链接都没有相关的任何提示呢?

求解

最新回复

你说的情况,至少系统不会崩溃吧? 我现在遇到的,编译链接没错,但是系统运行到那时,就会崩溃!  详情 回复 发表于 2009-4-8 19:20
点赞 关注

回复
举报

54

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
因为 RETAILMSG 用的是可变参数, 不管你后面%x 和 *pBufOut 之类的参数有多少个,在编译的时候它都当一个参数。 它只是在函数里面才对参数进行分解,用后面的*pBufOut之类参数的实际值去替换字符串中的转义符。
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
不是RETAILMSG的错误
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

4
 
1. Compiler 只能抓出 語法(Syntax) 錯誤, 不能抓出 邏輯(Logic) 錯誤.

2. C/C++, 其 參數數目不定 的函數(ex: printf, scanf...), 是不會管你傳幾個參數進去的, 故傳進去參數不對, 那是 Programmer 的問題, 造成 Garbage In, Garbage Out.

3. 可能是 pBufOut 其值無效, 故 aceess 它會造成 Data Abort.

4. 加油吧, 換個角度看, 把這些 bug 抓出來, 就更能顯現出你的價值了.

Paul, Chao @ Techware
 
 
 

回复

61

帖子

0

TA的资源

一粒金砂(初级)

5
 
这个编译器没有办法检查的。因为本身设计的时候这个参数就是不确定的,只能靠自己小心了。
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

6
 
“Data Abort:”是什么信息呢?
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

7
 
引用 5 楼 wjf_zjut 的回复:
“Data Abort:”是什么信息呢?


对,直接定位!
 
 
 

回复

88

帖子

0

TA的资源

一粒金砂(初级)

8
 
引用 5 楼 wjf_zjut 的回复:
“Data Abort:”是什么信息呢?

数据异常
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

9
 
想不到啊,不过后来也就学会了使用Remote Process Explorer的Crack Address功能定位程序的崩溃地址。[http://www.cnblogs.com/singlerace/archive/2009/02/26/1396366.html]。
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

10
 
  1. RETAILMSG(MSG_EN_1,(_T("CAM_IOCTL_SAMSUNG_PREVIEW_START(%x)\r\n"),*pBufOut, DRIVER_PREVIEW_ENABLE))
复制代码


在这种情况下,貌似 RETAILMSG 会只使用第一个参数 pBufOut ,抛弃第二个参数。
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

11
 
问题的关键不是使用哪个参数,反正现在我使用第二个的参数。
我只想知道为啥编译器会出现这样的原因,
同时也是写出来记录一下
 
 
 

回复

45

帖子

0

TA的资源

禁止发言

12
 
这个貌似跟printf比较相似,printf实现中扫描pattern,逐个对pattern中的%d啊之类的进行处理;后面的变参有三种情况:相等,小于,大于。相等的情况就是正常情况。paterrn个数小于变参,那么只会处理pattern个变参,多余的变参不会用到;pattern个数大于变参个数,那么也是按pattern个数处理,少的部分就用跟在最后一个变参后的内存数据作为参数。
 
 
 

回复

85

帖子

0

TA的资源

一粒金砂(初级)

13
 
引用 11 楼 morris88 的回复:
这个貌似跟printf比较相似,printf实现中扫描pattern,逐个对pattern中的%d啊之类的进行处理;后面的变参有三种情况:相等,小于,大于。相等的情况就是正常情况。paterrn个数小于变参,那么只会处理pattern个变参,多余的变参不会用到;pattern个数大于变参个数,那么也是按pattern个数处理,少的部分就用跟在最后一个变参后的内存数据作为参数。


你说的情况,至少系统不会崩溃吧?

我现在遇到的,编译链接没错,但是系统运行到那时,就会崩溃!
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表