关于函数返回值的问题

[复制链接]
3098|11
 楼主| chy2001743 发表于 2008-11-7 10:55 | 显示全部楼层 |阅读模式
自己声明了一个bdata存放可以位寻地的字节,可是碰到了意想不到的情况,程序如下:

uchar bdata datbyte;
.....
uchar read_ds()       //这个函数用来从dsio脚中读取一个字节存进datbyte中。
{
uchar i;
for(i=0;i<8;i++)
{
  datbyte=datbyte>>1;
  datbyte7=dsio;
  dsscl=1;
  dsscl=0;
}
return(datbyte);              //我是想返回 datbyte这个已经存放好了8位dsio位数据的一个字节可是编译后老是提示return-expression on void-function. 就是说return表达不正确的意思吧?
}

请问怎么样解决这个问题。
chen3bing 发表于 2008-11-7 11:10 | 显示全部楼层

你用的什么编译软件

我在keil uVision2中编译没问题。
 楼主| chy2001743 发表于 2008-11-7 11:13 | 显示全部楼层

回2楼

我用的是keil uVison3 
 楼主| chy2001743 发表于 2008-11-7 11:20 | 显示全部楼层

谢2楼热心提示

我刚刚将这段程序独立出来运行编译却又没有出错,为什么放入整个程序中会有错误提示呢。
学生D 发表于 2008-11-7 13:01 | 显示全部楼层

全局变量是不必返回的。

你的datbyte变量设定为了全局变量。它具有全程序作用域,所有模块都能看得到它,并使用它。并不单隶属于 read_ds() 函数。没必要return;              

return( ); 返回的应该是局部变量。

除非你把uchar bdata datbyte;  放到uchar read_ds() 函数内部成为局部变量。才可以写成
return (datbyte );                      
xuehongren 发表于 2008-11-7 16:56 | 显示全部楼层

5楼应该是正解

xwj 发表于 2008-11-7 17:17 | 显示全部楼层

当然可以返回的

自己去检查前面是否有void read_ds();的声明
ayb_ice 发表于 2008-11-7 21:06 | 显示全部楼层

返回是没有问题的

检查函数声明与定义是否一致
呆板书生 发表于 2008-11-8 08:40 | 显示全部楼层

uchar read_ds()

C 会编译成 uchar int read_ds()

学生D 发表于 2008-11-8 11:14 | 显示全部楼层

请教一点。

假定如7楼、8楼所说,“变量datbyte 是可以返回的”。

众所周知,return 的char值必然是在当前using寄存器区的R7中返回,而楼主所定义的全局变量uchar bdata datbyte;在位变量区。把位变量区的bdata datbyte送到R7再返回,......编译器是不是在质疑这个问题?
ayb_ice 发表于 2008-11-8 13:26 | 显示全部楼层

我试了一下没有任何问题

我试了一下没有任何问题,其实提示已经说了是函数声明不正确.
 楼主| chy2001743 发表于 2008-11-14 11:01 | 显示全部楼层

调试出来了

  过了几天了忘记回这个帖子啦。不好意思
  根据编译后的结果,推断编译器质疑的问题可能是:函数返回的是一个unsigned char 类型的数据,可是调用函数没有声明是 unsigned char read_ds();
  
  当我声明了以后,函数就可以用了。
  全局变量不需要返回值了,不过是不需要吧。因为我把datbyte改成默认的ACC也行。
  谢谢 学生D & ayb_ice & xwj 
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

9

帖子

0

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