| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1049 人关注过本帖
标题:关于函数返回值的问题!
只看楼主 加入收藏
Maximilian
Rank: 1
等 级:新手上路
帖 子:27
专家分:0
注 册:2014-11-12
结帖率:75%
收藏
已结贴  问题点数:20 回复次数:22 
关于函数返回值的问题!
在一个函数里,有一些值需要用特定条件判断,满足条件的就用return作为返回值返回给函数,但是c语言中函数返回值只能return回一个值。所以如果想要返回多个值的话,该用结构体还是什么?
搜索更多相关主题的帖子: return 结构体 c语言 
2014-11-29 21:55
编译中。。
Rank: 7Rank: 7Rank: 7
来 自:中国
等 级:黑侠
帖 子:198
专家分:511
注 册:2011-7-29
收藏
得分:0 
返回多个值。。以我目前所知,不可能。。但是可以换一种方法。  比如我需要a这个值, 我可以   int  *b =(int *)malloc(sizeof(int)) 然后  *b=a  这样就可以再函数外获得a的值了   或者传递指针,直接修改值。

 当我感到些许疲倦时   便想躺在阳光下,小路旁 . 可这些往往都是奢望..
2014-11-29 22:08
yahwei
Rank: 7Rank: 7Rank: 7
来 自:湖~
等 级:黑侠
威 望:3
帖 子:145
专家分:644
注 册:2011-11-10
收藏
得分:0 
程序代码:
#include <stdio.h>

int fun ( void )
{
    static int a = 0;
    a++ ;
    return a ;
}

int main ( void )
{
    int i ;
    for ( i = 0; i < 10; i++ ) {
        printf( "%d\n", fun() ) ;
    }
    return 0;
}

运行这段代码,理解static的用法,希望对你有帮助!

[qq]949654600[/qq]
2014-11-29 22:34
soulmate1023
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:6
帖 子:256
专家分:831
注 册:2014-9-23
收藏
得分:0 
可用方法:
1.函数值作为数组传回
2.把这些函数值的这种组合封装成一个类
3.传入引用
4.全局变量

引用自http://bbs.
2014-11-29 22:50
Maximilian
Rank: 1
等 级:新手上路
帖 子:27
专家分:0
注 册:2014-11-12
收藏
得分:0 
回复 3 楼 yahwei
谢谢你的回复,不过我想问一下,如果我这样写的话,确实是不能返回一个数组,但是怎么用结构体对数组buf进行封装,然后return一个结构体呢?谢谢!
程序代码:

 unsigned int func(void)

 {
   unsigned int i;
   unsigned int j=0;
   unsigned int buf[2];
   for(i=0;i<10;i++)  
   {
     if(i==1 || i==3)
      
      i = buf[j];
      j++;                  
   } 
   return buf;    

 }
2014-11-30 02:36
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:20 
程序代码:
/*
http://bbs.bccn.net/thread-439278-1-1.html

问题:我有16个地址从0xE0到0xFE,我想通过一个条件判断哪些地址是可用的,哪些是不可用的,可用的地址为1,不可用
的为0,例如,通过判断只有0xE0和0xFe可用,那么应该得到1000000000000001,然后可以作为返回值使用
*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>

/*
地址状态数据结构:
    nAddress  -- 地址偏移量
    strStatus -- 所有地址的状态值字符串
注:为适应不确定数目的地址,此处设计为用动态分配内存方式生成字符串strStatus。若希望回避动态分配内存,可设定strStatus为
    足够大的数组,比如char strStatus[16]这样的,不需留结束符,有效的地址数目由nAddress值决定
*/
struct Status
{
    size_t nAddress;
    char*  strStatus;
};

void Pause(void);
Status SetStatus(const char* strStatus);

int main(void)
{
    Status theStatus = SetStatus("1000000000000001");
    for (size_t index = 0; index < theStatus.nAddress; ++index)
    {
        printf_s("0x%02X = %1d\n", 0xE0 + index, theStatus.strStatus[index]);
    }
    delete [] theStatus.strStatus;

    Pause();
    return EXIT_SUCCESS;
}

void Pause(void)
{
    printf_s("\nPress any key to continue...");
    _getch();
}

// 重点:看明白这个函数是怎么生成状态字符串的并返回的,即知如何应用到自己的程序中
Status SetStatus(const char* strStatus)
{
    Status retStatus;
    retStatus.nAddress = strlen(strStatus);
    retStatus.strStatus = new char[retStatus.nAddress];

    for (size_t index = 0; index < retStatus.nAddress; ++index)
    {
        // 每个地址的状态以数值0和1表示
        retStatus.strStatus[index] = strStatus[index] - '0';
    }

    return retStatus;
}


使用Status结构,用0和1依次直接填写地址状态,然后把有效地址数设正确,返回这个结构即可。这是BASIC的动态字符串模型!

我这个例子和解释已经满足了你最初无参数的要求,仔细想一想就明白怎么做到无参数,如果这都搞不到为己所用,那么写程序的领悟力就麻烦了。其实我一开始就已经教了你,也给了例子,不知道为什么你悟不到,还多发两个帖子,而每次都迫不可待地结帖,问题没解决,你结个啥。这次的例子已经更直接,总不能我把16个地址赋值的代码也写出来你才明白吧?


[ 本帖最后由 TonyDeng 于 2014-11-30 05:08 编辑 ]

授人以渔,不授人以鱼。
2014-11-30 04:55
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
另外一种方法,是C迷偏好的,即用位运算,针对16个地址编制一个16位整数返回,但这种方案你写代码的量不会比这个少,也不会高效太多,因为你的地址数并不以百万、千万计,深入原子内部数电子数,不会比直接数原子数更节省资源。这还是次要的,更重要的,是这种方案没有适应不确定地址数的扩展能力,对16个地址,你就去想16位整数,那么如果是24个地址呢,没有24位整数,你用32位整数,从哪里开始到哪里结束又必须硬编码,那种代码从16位改到32位也不轻松,再离谱一点,假如你有100个地址,他们就做不出100位的整数。与其想那种没有可扩展性的方案,不如直接点,这就是所谓的直接代码,不要以为总去抠硬件细节就如何了不起,那往往反而自找麻烦。对C/C++这种语言来说,它严重依赖实现环境,你在代码中写int,满以为是32位整数,其实未必,那时你更头痛。

授人以渔,不授人以鱼。
2014-11-30 05:20
Maximilian
Rank: 1
等 级:新手上路
帖 子:27
专家分:0
注 册:2014-11-12
收藏
得分:0 
回复 6 楼 TonyDeng
非常感谢版主这么晚了还回复我的帖子!!说得非常的详细!!版主我现在只需要返回满足条件的地址,不需要用1和0来表示状态,所以应该不会这么麻烦了,如果用我写的下边的程序,然后用结构体对这个数组buf进行处理然后进行返回呢?
程序代码:
unsigned int func(void)
{
   unsigned int i;
   unsigned int j=0;
   unsigned int buf[2];
   for(i=0;i<10;i++)  
   {
     if(i==1 || i==3)
      
      i = buf[j];
      j++;                  
   } 
   return buf;    
}
2014-11-30 05:22
Maximilian
Rank: 1
等 级:新手上路
帖 子:27
专家分:0
注 册:2014-11-12
收藏
得分:0 
回复 7 楼 TonyDeng
我以为这个问题应该比较常见的,因为如果做机器人编程,人们想让机器人知道都有哪些传感器已经与自己连接,然后把已连接的传感器地址,作为函数的返回值为其他函数所用,但是实际情况是,一个机器人肯定不止连接一个传感器,所以返回值也不会是一个值,而是多个值,这是我的思路

[ 本帖最后由 Maximilian 于 2014-11-30 05:29 编辑 ]
2014-11-30 05:27
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
回复 8 楼 Maximilian
你不能返回局部变量!这里buf是函数内自动变量,函数一旦结束,buf就会被释放回收,返回得到的是不确定数据。要让数据不被自动释放,在堆中分配数据!像我给的例子那样,在函数内用malloc()分配(我的new就是C的malloc()),这样就可以返回,但你要记得,用完必须free(),像我那样在外部delete。

授人以渔,不授人以鱼。
2014-11-30 05:30
快速回复:关于函数返回值的问题!
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018229 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved