打印

有一个纠结的问题:有返回值函数如何返回错误码

[复制链接]
2347|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
XIANSir|  楼主 | 2011-4-22 22:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
假如有一个函数:char DS1302_GetSecond(void);
用来获取时间的秒部分。。

可是如果我想,当DS1302工作错误无法读到值时能够返回一个错误码,那可怎么办呢???

我现在有三种方法:
1、DS1302不正常工作时返回0xFF,因为秒钟不会取这个值,所以通过返回值和0xFF比较就可以知道这个值是不是正确的时间值。

但是这个方法不够通用,比如如果是一片AT24C08,读到的正确值就有可能是0xFF,这时的0xFF就无法判断是正确的返回值,还是错误码了。所以Pass掉!!

2、把函数定义改为:
char DS1302_GetSecond(char *sec)
时间值由sec指针带出,返回值就只用与判断程序执行的状态。。

这个方法倒是不会冲突,可惜太笨了,读一个字符竟然还要使用指针,显的啰嗦。。

3、在函数中当函数执行不能正常读到值,即DS1302出现错误时,直接让程序在出错的地方死掉(无限循环),根本就不退出!!!

这个方法更笨,实在太笨了。。。

4、在DS1302的模块级别定义一个状态变量,DS1302的所有函数的执行状态都存在这个变量中,每执行完一次DS1302_GetSecond函数就检查一下这个状态变量,以决定这个读到的时间值是否可以被采纳。

还是太麻烦

。。。。。



唉,反正是很纠结,很麻烦,纠结。。。。。

相关帖子

沙发
XIANSir|  楼主 | 2011-4-22 22:35 | 只看该作者
对于第一个方法再说一下:
我以前用的错误码的值都是0x01,如果这里把错误码改为0xFF,不知道会不会导致以前写的代码和以后的代码混在一起工作时会不会出现莫名其妙的现象,所以不敢轻易改动。。。

唉,这时我就想到了脚本语言的好了——可以同时返回多个值!!!

使用特权

评论回复
板凳
sysdriver| | 2011-4-22 23:13 | 只看该作者
本帖最后由 sysdriver 于 2011-4-22 23:21 编辑

第二种方法好,数据结构的书中的算法大多这样返回。

而且,使用指针是非常灵活的做法。怎么会罗嗦?
再说那指针也是局部的,我不觉得还有什么比它好的方法。

使用特权

评论回复
地板
XIANSir|  楼主 | 2011-4-23 08:16 | 只看该作者
3# sysdriver
嗯,回去又好好想了一下,还是这个方法最好,好像也没有更好的方法了,所以,接受你的建议!!

使用特权

评论回复
5
XIANSir|  楼主 | 2011-4-23 08:22 | 只看该作者
而且又想起了第二种方法的一个好处:
ui08 _24_wdat(ui08 addr,byte dat[],ui08 cnt)
上面的函数是AT24C08的驱动写函数,功能是向addr指定的地址处写入cnt个字节,字节当然是通过dat数组来传递了。

可是当只写一个字节的时候,怎么办呢??
很简单: _24_wdat(0x00,&a,1);
看,就这么简单,a明明是一个char a;定义的字节,却可以向数组一样传递进去,可见使用指针传递参数的好处啊!!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:冷暖自知,泰然处之;持之以恒,必有所成!

0

主题

609

帖子

2

粉丝