怎么用指针把多个参数传出去?

[复制链接]
2649|24
 楼主| wlhooops 发表于 2015-8-30 18:35 | 显示全部楼层 |阅读模式
有一个函数想把多个值传出函数,用指针,试了一下没法编译成功,想请问一下是什么原因?这个函数写在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();       
                }
        }


}


coody 发表于 2015-8-30 18:47 | 显示全部楼层
使用数组吧,返回一个指针
 楼主| wlhooops 发表于 2015-8-30 19:05 | 显示全部楼层
coody 发表于 2015-8-30 18:47
使用数组吧,返回一个指针

那这个数组要是全局的数组吗?
diweo 发表于 2015-8-30 19:14 | 显示全部楼层
GET_TIME_DS1302(char & hour , char & min , char & mon , char & date);
把char去掉应该可以的
 楼主| wlhooops 发表于 2015-8-30 19:20 | 显示全部楼层
diweo 发表于 2015-8-30 19:14
GET_TIME_DS1302(char & hour , char & min , char & mon , char & date);
把char去掉应该可以的 ...

谢谢!试了下编译,对if(*min == 0x00) 中*号报错
diweo 发表于 2015-8-30 19:46 | 显示全部楼层
你上面贴的代码是 if(*min < 0x01),
不过没关系。这里确实也错了。
因为min本身是char类型的,所以不需要*了。
 楼主| wlhooops 发表于 2015-8-30 19:53 | 显示全部楼层
diweo 发表于 2015-8-30 19:46
你上面贴的代码是 if(*min < 0x01),
不过没关系。这里确实也错了。
因为min本身是char类型的,所以不需要* ...

有点不明白,*min不是指min这个指针变量所指向地址中的值吗?*min 不是等价于”mi=RW_DATA_DS1302(0x85);  //read hour “吗?
风的样子 发表于 2015-8-30 20:03 | 显示全部楼层
wlhooops 发表于 2015-8-30 19:20
谢谢!试了下编译,对if(*min == 0x00) 中*号报错

是不是优先级的问题
diweo 发表于 2015-8-30 20:11 | 显示全部楼层
本帖最后由 diweo 于 2015-8-30 20:26 编辑

哎,怪我没仔细看,原来还有错误。。。

你在main里面定义是 char hour,min,mon,date;这里min是char,不是指针。
在void GET_TIME_DS1302(char *hour , char *min , char *mon , char *date)里面,min是char*,确实是指针,
就很容易混淆了。

在GET_TIME_DS1302函数体内,
*min不是指min这个指针变量所指向地址中的值吗?------是的。
*min 不是等价于”mi=RW_DATA_DS1302(0x85);---------是的(如果RW_DATA_DS1302返回值是uchar的话)

但是你接下来下 *min = &mi;就不对了,因为不需要&。

yklstudent 发表于 2015-8-30 21:43 | 显示全部楼层
这个明显一个结构体,通过结构体指针变量传递数据
cauhorse 发表于 2015-8-30 22:52 | 显示全部楼层
  1. typedef struct _STRUCT_SYS_TIME     /*structure for a time log*/                     
  2. {
  3.     unsigned char ucSecond;
  4.     unsigned char ucMinute;
  5.     unsigned char ucHour;
  6.     unsigned char ucDate;
  7.     unsigned char ucMonth;
  8.     unsigned char ucYear;
  9. }SYS_TIME;

  10. void gvGetDateTime(SYS_TIME *STRUCT_TIME)
  11. {
  12.         STRUCT_TIME->ucSecond = nucReadDs1302(READ_SECOND);
  13.         STRUCT_TIME->ucMinute = nucReadDs1302(READ_MINUTE);
  14.         STRUCT_TIME->ucHour   = nucReadDs1302(READ_HOUR);
  15.         STRUCT_TIME->ucDate   = nucReadDs1302(READ_DATE);
  16.         STRUCT_TIME->ucMonth  = nucReadDs1302(READ_MONTH);
  17.         STRUCT_TIME->ucYear   = nucReadDs1302(READ_YEAR);
  18. }


传入参数为结构体指针。
949155525 发表于 2015-8-30 22:54 来自手机 | 显示全部楼层
补习下C语言吧,语法不规范导致的。
 楼主| wlhooops 发表于 2015-8-30 22:56 | 显示全部楼层
949155525 发表于 2015-8-30 22:54
补习下C语言吧,语法不规范导致的。

恩,回去再看看书......
 楼主| wlhooops 发表于 2015-8-30 22:58 | 显示全部楼层
diweo 发表于 2015-8-30 20:11
哎,怪我没仔细看,原来还有错误。。。

你在main里面定义是 char hour,min,mon,date;这里min是char,不是指 ...

得回去补补指针了.....
xmar 发表于 2015-8-31 08:15 | 显示全部楼层
GET_TIME_DS1302(char & hour , char & min , char & mon , char & date); // 这句改成:

GET_TIME_DS1302( & hour ,  & min ,  & mon ,  & date);
changmiao 发表于 2015-8-31 09:48 | 显示全部楼层
C的功底太差了吧,至少指针这一块觉得你不懂,多处地方都是错的。
wkshengren 发表于 2015-8-31 11:44 | 显示全部楼层
  1. void GET_TIME_DS1302(char *hour , char *min , char *mon , char *date)
  2. {
  3.         uchar ho,mi,mo,da;
  4.         ho = RW_DATA_DS1302(0x83);  //read min
  5.         mi = RW_DATA_DS1302(0x85);  //read hour
  6.         mo = RW_DATA_DS1302(0x87);  //read date
  7.         da = RW_DATA_DS1302(0x89);  //read mon
  8.         *hour = ho;
  9.         *min = mi;
  10.         *mon = mo;
  11.         *date = da;
  12. }

  13. #include"STC12.H"
  14. #include"74HC595.H"
  15. #include"DS1302.H"
  16. #define uchar unsigned char
  17. #define uint  unsigned int


  18. void main ()
  19. {
  20.         char hour,min,mon,date;
  21.         SET_TIME_DS1302();
  22.         
  23.         while(1)
  24.         {
  25.                 GET_TIME_DS1302(& hour ,& min ,& mon ,& date);
  26.                 if(min < 0x01)//看取出的分钟是否小于0x01
  27.                 {
  28.                   WR_595(0xff);//是的话就让74hc595全部输出1
  29.                   OUT_595();
  30.                 }
  31.                 else
  32.                 {
  33.                   WR_595(0x0f);//是的话就让74hc595 4个通道输出1
  34.                   OUT_595();        
  35.                 }
  36.         }


  37. }

这样写看着舒服点
lgq1542380129 发表于 2015-8-31 13:02 | 显示全部楼层
用结构体吧。
kamen588 发表于 2015-8-31 13:03 | 显示全部楼层
*hour = &ho;
  *min = &mi;
  *mon = &mo;
  *date = &da;

C语言基础不过关,这里错了
JerryWu75 发表于 2015-8-31 15:40 | 显示全部楼层
本帖最后由 JerryWu75 于 2015-8-31 18:38 编辑

*hour=&ho是向指针指向的地址赋值,
应该是hour=(char *)&ho而且lz的ho,mi等变量是函数内的局部变量,在函数内将ho的地址付给hour,但是一旦退出函数后,hour将指向不确定的地址
您需要登录后才可以回帖 登录 | 注册

本版积分规则

15

主题

90

帖子

1

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