[疑难问答] 想把多个值传出函数,用指针,试了一下没法编译成功

[复制链接]
2238|27
 楼主| Edisons 发表于 2016-7-19 19:28 | 显示全部楼层 |阅读模式
有一个函数想把多个值传出函数,用指针,试了一下没法编译成功,想请问一下是什么原因?这个函数写在DS1302.C 里

void GET_TIME_DS1302(char *hour , char *min , char *mon , char *date)
{
        uchar ho,mi,mo,da;
        ho = RW_DATA_DS1302(0x83);  //read min
        mi = RW_DATA_DS1302(0x85);  //read hour
        mo = RW_DATA_DS1302(0x87);  //read date
        da = RW_DATA_DS1302(0x89);  //read mon
        *hour = &ho;
        *min = &mi;
        *mon = &mo;
        *date = &da;
}

把取出的时间日期使用指针在main函数中调用,但是没成功,这是怎么回事?想请教一下大家我这样调用是不是有问题?
#include"STC12.H"
#include"74HC595.H"
#include"DS1302.H"
#define uchar unsigned char
#define uint  unsigned int


void main ()
{
        char hour,min,mon,date;
        SET_TIME_DS1302();
        
        while(1)
        {
                GET_TIME_DS1302(char & hour , char & min , char & mon , char & date);
                if(*min < 0x01)//看取出的分钟是否小于0x01
                {
                  WR_595(0xff);//是的话就让74hc595全部输出1
                  OUT_595();
                }
                else
                {
                  WR_595(0x0f);//是的话就让74hc595 4个通道输出1
                  OUT_595();        
                }
        }


}
_gege 发表于 2016-7-19 19:30 | 显示全部楼层
使用数组吧,返回一个指针试试。
Mozarts 发表于 2016-7-19 19:33 | 显示全部楼层
GET_TIME_DS1302(char & hour , char & min , char & mon , char & date);
把char去掉应该可以的。
Listate 发表于 2016-7-19 19:36 | 显示全部楼层
你上面贴的代码是 if(*min < 0x01),
不过没关系。这里确实也错了。
laozhongyi 发表于 2016-7-19 19:39 | 显示全部楼层
是的,min本身是char类型的,所以不需要*。
wanglaojii 发表于 2016-7-19 19:44 | 显示全部楼层
有点不明白,*min不是指min这个指针变量所指向地址中的值吗?
zhouhuanの 发表于 2016-7-19 19:48 | 显示全部楼层
你在main里面定义是 char hour,min,mon,date;这里min是char,不是指针。
在void GET_TIME_DS1302(char *hour , char *min , char *mon , char *date)里面,min是char*,确实是指针,就很容易混淆了。
handleMessage 发表于 2016-7-19 19:52 | 显示全部楼层
这个明显一个结构体,通过结构体指针变量传递数据
 楼主| Edisons 发表于 2016-7-19 19:58 | 显示全部楼层
Mozarts 发表于 2016-7-19 19:33
GET_TIME_DS1302(char & hour , char & min , char & mon , char & date);
把char去掉应该可以的。 ...

试了下编译,对if(*min == 0x00) 中*号报错
 楼主| Edisons 发表于 2016-7-19 19:59 | 显示全部楼层
本帖最后由 Edisons 于 2016-7-19 20:01 编辑

得回去补补指针了.....。。。。
bbapple 发表于 2016-7-19 20:03 | 显示全部楼层
hour = &ho;
  *min = &mi;
  *mon = &mo;
  *date = &da;

C语言基础不过关,这里错了。。。。

评论

说得太对了  发表于 2016-7-20 09:02
sourceInsight 发表于 2016-7-19 20:06 | 显示全部楼层
*hour=&ho是向指针指向的地址赋值,应该是hour=(char *)&ho

评论

C语言也不过关  发表于 2016-7-20 09:03
ta1ent 发表于 2016-7-19 21:47 | 显示全部楼层
本帖最后由 ta1ent 于 2016-7-19 21:49 编辑

  • *hour = &ho;
    *min = &mi;
    *mon = &mo;
    *date = &da;

错了!!
应该去掉 &:
  • *hour = ho;
    *min = mi;
    *mon =mo;
    *date = da;


还有比较部分应该是 min<0x01

还有就是不要一会儿char一会儿uchar,统一用uchar吧。




datouyuan 发表于 2016-7-20 09:08 | 显示全部楼层
ta1ent 发表于 2016-7-19 21:47*hour = &ho;
*min = &mi;
*mon = &mo;

楼上正解.
GET_TIME_DS1302(char & hour , char & min , char & mon , char & date);
我不知这句会不会有问题,一般是在函数声明这样写.
应该写成  GET_TIME_DS1302(& hour ,  & min ,  & mon , & date);
datouyuan 发表于 2016-7-20 09:13 | 显示全部楼层
你用多个指针,每个指针只传递一个数据,这样效率太低了.

多个数据互相有关联,可以用结构的方式,用一个指针传递多个数据.
台湾笙泉MCU 发表于 2016-7-20 10:07 | 显示全部楼层
学习了



笙泉单片机代理,QQ: 3166720948
oufuqiang 发表于 2016-7-20 10:57 | 显示全部楼层
用数组咯。
ticomi 发表于 2016-7-20 15:53 | 显示全部楼层
C的基础问题,建议看下周立功写的C语言基础书籍,这些问题说的非常清楚。
 楼主| Edisons 发表于 2016-8-17 19:51 | 显示全部楼层
_gege 发表于 2016-7-19 19:30
使用数组吧,返回一个指针试试。

恩  这个早就试过啦!!
 楼主| Edisons 发表于 2016-8-17 19:52 | 显示全部楼层
Mozarts 发表于 2016-7-19 19:33
GET_TIME_DS1302(char & hour , char & min , char & mon , char & date);
把char去掉应该可以的。 ...

是的,问题和这个差不多的,多谢啦
您需要登录后才可以回帖 登录 | 注册

本版积分规则

67

主题

1526

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部
0