打印

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

[复制链接]
2234|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去掉应该可以的

使用特权

评论回复
5
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) 中*号报错

使用特权

评论回复
6
diweo| | 2015-8-30 19:46 | 只看该作者
你上面贴的代码是 if(*min < 0x01),
不过没关系。这里确实也错了。
因为min本身是char类型的,所以不需要*了。

使用特权

评论回复
7
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 “吗?

使用特权

评论回复
8
风的样子| | 2015-8-30 20:03 | 只看该作者
wlhooops 发表于 2015-8-30 19:20
谢谢!试了下编译,对if(*min == 0x00) 中*号报错

是不是优先级的问题

使用特权

评论回复
9
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;就不对了,因为不需要&。

使用特权

评论回复
10
yklstudent| | 2015-8-30 21:43 | 只看该作者
这个明显一个结构体,通过结构体指针变量传递数据

使用特权

评论回复
11
cauhorse| | 2015-8-30 22:52 | 只看该作者
typedef struct _STRUCT_SYS_TIME     /*structure for a time log*/                      
{
    unsigned char ucSecond;
    unsigned char ucMinute;
    unsigned char ucHour;
    unsigned char ucDate;
    unsigned char ucMonth;
    unsigned char ucYear;
}SYS_TIME;

void gvGetDateTime(SYS_TIME *STRUCT_TIME)
{
        STRUCT_TIME->ucSecond = nucReadDs1302(READ_SECOND);
        STRUCT_TIME->ucMinute = nucReadDs1302(READ_MINUTE);
        STRUCT_TIME->ucHour   = nucReadDs1302(READ_HOUR);
        STRUCT_TIME->ucDate   = nucReadDs1302(READ_DATE);
        STRUCT_TIME->ucMonth  = nucReadDs1302(READ_MONTH);
        STRUCT_TIME->ucYear   = nucReadDs1302(READ_YEAR);
}


传入参数为结构体指针。

使用特权

评论回复
12
949155525| | 2015-8-30 22:54 | 只看该作者
补习下C语言吧,语法不规范导致的。

使用特权

评论回复
13
wlhooops|  楼主 | 2015-8-30 22:56 | 只看该作者
949155525 发表于 2015-8-30 22:54
补习下C语言吧,语法不规范导致的。

恩,回去再看看书......

使用特权

评论回复
14
wlhooops|  楼主 | 2015-8-30 22:58 | 只看该作者
diweo 发表于 2015-8-30 20:11
哎,怪我没仔细看,原来还有错误。。。

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

得回去补补指针了.....

使用特权

评论回复
15
xmar| | 2015-8-31 08:15 | 只看该作者
GET_TIME_DS1302(char & hour , char & min , char & mon , char & date); // 这句改成:

GET_TIME_DS1302( & hour ,  & min ,  & mon ,  & date);

使用特权

评论回复
16
changmiao| | 2015-8-31 09:48 | 只看该作者
C的功底太差了吧,至少指针这一块觉得你不懂,多处地方都是错的。

使用特权

评论回复
17
wkshengren| | 2015-8-31 11:44 | 只看该作者
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;
}

#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(& hour ,& min ,& mon ,& date);
                if(min < 0x01)//看取出的分钟是否小于0x01
                {
                  WR_595(0xff);//是的话就让74hc595全部输出1
                  OUT_595();
                }
                else
                {
                  WR_595(0x0f);//是的话就让74hc595 4个通道输出1
                  OUT_595();        
                }
        }


}

这样写看着舒服点

使用特权

评论回复
18
lgq1542380129| | 2015-8-31 13:02 | 只看该作者
用结构体吧。

使用特权

评论回复
19
kamen588| | 2015-8-31 13:03 | 只看该作者
*hour = &ho;
  *min = &mi;
  *mon = &mo;
  *date = &da;

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

使用特权

评论回复
20
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

粉丝