| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3555 人关注过本帖
标题:【函数】返回二维数组的函数怎么声明?
只看楼主 加入收藏
蚕头燕尾
Rank: 10Rank: 10Rank: 10
来 自:Gryffindo
等 级:贵宾
威 望:12
帖 子:734
专家分:1546
注 册:2013-3-24
收藏
得分:0 
这是我的函数定义:

double *mult(double a[LineRow][LineRow],double b[LineRow][LineRow])
{
    double c[LineRow][LineRow]={0};

   /*省略函数功能部分*/

    return c[0];
}

声明如下:

double *mult(double a[LineRow][LineRow],double b[LineRow][LineRow]);

调用如下:

(double *[LineRow])mult(a,b)

//这里的LineRow是宏定义的,等于3


报错如下:

error C2440: “类型转换”: 无法从“double *”转换为“double *[3]

我哪里写错了吗?

学习编程,为的是表达自己的思想,而不是被别人的思想所禁锢。要先明白自己想干嘛,而不要先问别人让你干嘛。               

                                                                                                                    Black Cat      Hello Tomorrow~
2013-08-17 20:56
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
(double *[LineRow])mult(a,b) ==》 (double (*)[LineRow])mult(a,b)

重剑无锋,大巧不工
2013-08-17 21:06
蚕头燕尾
Rank: 10Rank: 10Rank: 10
来 自:Gryffindo
等 级:贵宾
威 望:12
帖 子:734
专家分:1546
注 册:2013-3-24
收藏
得分:0 


谢谢b版。

另外我又在想,为什么这样用就是错的:

print((double (*)[LineRow])mult(a,b));

其中:

void print(double t[][LineRow])
{
    for(int i=0;i<LineRow;i++)
    {
        for(int j=0;j<LineRow;j++)
        {
            cout<<t[i][j]<<"\t";
        }
        cout<<endl;
    }

}

而我直接这样写:

    for(int i=0;i<LineRow;i++)
    {
        for(int j=0;j<LineRow;j++)
        {
            cout<<((double (*)[LineRow])mult(a,b))[i][j]<<"\t";
        }
        cout<<endl;
    }
就能得到想要的结果。

学习编程,为的是表达自己的思想,而不是被别人的思想所禁锢。要先明白自己想干嘛,而不要先问别人让你干嘛。               

                                                                                                                    Black Cat      Hello Tomorrow~
2013-08-17 21:32
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
你的mult返回的是一个局部变量的指针,而这个局部变量在函数返回后就被释放了。

print((double (*)[LineRow])mult(a,b))这样的用法, print中的变量会覆盖mult中的c所在的位置(因为它们都是创建在栈里的)。

第二种方式得到了你想要的结果是因为mult返回后虽然栈已经释放了它的局部变量,但这部分空间暂时没有被使用,内容没有被覆盖。但是这种操作方式本身就越界了,当你加入其它操作后很可能造成其它不确定的后果。这种方式是大忌,不要心存侥幸。

重剑无锋,大巧不工
2013-08-17 21:50
蚕头燕尾
Rank: 10Rank: 10Rank: 10
来 自:Gryffindo
等 级:贵宾
威 望:12
帖 子:734
专家分:1546
注 册:2013-3-24
收藏
得分:0 
哦。。。。!

thanks



学习编程,为的是表达自己的思想,而不是被别人的思想所禁锢。要先明白自己想干嘛,而不要先问别人让你干嘛。               

                                                                                                                    Black Cat      Hello Tomorrow~
2013-08-17 22:25
蚕头燕尾
Rank: 10Rank: 10Rank: 10
来 自:Gryffindo
等 级:贵宾
威 望:12
帖 子:734
专家分:1546
注 册:2013-3-24
收藏
得分:0 
那我就定义一个全局变量c吧,避免调用print时候在栈里面发生覆盖,也不会出现释放问题了。


谢谢b版啦

学习编程,为的是表达自己的思想,而不是被别人的思想所禁锢。要先明白自己想干嘛,而不要先问别人让你干嘛。               

                                                                                                                    Black Cat      Hello Tomorrow~
2013-08-17 22:34
快速回复:【函数】返回二维数组的函数怎么声明?
数据加载中...
 
   



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

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