爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 6847|回复: 15

C++调用函数的时候返回数据的若干问题

[复制链接]

新浪微博达人勋

发表于 2013-8-20 12:06:53 | 显示全部楼层 |阅读模式

登录后查看更多精彩内容~

您需要 登录 才可以下载或查看,没有帐号?立即注册 新浪微博登陆

x
最近在研究C++的调用函数时,最关键的是如何使函数返回一个数组而不仅仅是一个数据,网上参考的做法;

#include<iostream>
using namespace std;

int* Array()
{  
int *a;
a=new int [10];

  1. for(int
  2. i=0;i<10;i++)
  3. {
  4.   a=i+1;
  5.   
  6. cout<<a<<"
  7. ";
  8. }
  9. cout<<endl;
  10. return
  11. a;
  12. }

  13. void main()
  14. {
  15. int
  16. *b;
  17. b=Array();

  18. for(int  i=0;i<10;i++)
  19.   cout<<b<<"
  20. ";
  21.   cout<<endl;
  22. }


但是不知道此处的C++指针与Fortran的指针是否一致,也就是二者的指针是否基于统一架构呢?
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2013-8-20 12:07:43 | 显示全部楼层
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2013-8-20 14:04:31 | 显示全部楼层
可以把指针放到函数参数列表里
void fnArray(int* p, const int& nSize) {do someting}
调用时候
int nSize = 10;
int* p = new int[nSize];
fnArray(p, nSize);
delete[] p;
p = NULL;

密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2013-8-20 23:03:12 | 显示全部楼层

你看下,我是按照你的思路写出来的,你是这样想的吗?
  1. #include <iostream>

  2. using namespace std;
  3. void fnArray(int* p, const int nSize);

  4. int main()
  5. {
  6.     const int nSize = 10;
  7.     int* p = new int[nSize];
  8.     fnArray(p,nSize);

  9.     for(int i=1;i<=10;i++)
  10.         cout<<p[i-1]<<endl;
  11.     delete[] p;
  12.     p = NULL; ///此处删除指针后,为什么要赋值为空呢?
  13.     cout << "Hello world!" << endl;
  14.     return 0;
  15. }

  16. void fnArray(int* p, const int nSize)
  17. {
  18.     using namespace std;

  19.     for(int i=1;i<=10;i++)
  20.         p[i-1] = i;
  21. }
复制代码
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2013-8-20 23:03:51 | 显示全部楼层
lyly061 发表于 2013-8-20 14:04
可以把指针放到函数参数列表里
void fnArray(int* p, const int& nSize) {do someting}
调用时候

但是我对你在最后将指针设置为NULL不是很理解,求正解。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2013-8-20 23:04:35 | 显示全部楼层
一个讲解参数详解的非常不错的文章呢:
http://www.cnblogs.com/Romi/archive/2012/08/09/2630014.html
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2013-8-21 13:21:31 | 显示全部楼层
本帖最后由 lyly061 于 2013-8-21 13:55 编辑
haobang008 发表于 2013-8-20 23:03
但是我对你在最后将指针设置为NULL不是很理解,求正解。


删除指针后并赋空值,防止后面的程序非法调用此指针。
程序代码少的时候可以不必理会。
程序复杂的时候调用指针之前需要判断指针是否合法:
ASSERT (p);
或者
if (p) { do someting } else { error case }
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2013-8-21 13:30:10 | 显示全部楼层
lyly061 发表于 2013-8-21 13:21
删除指针后并赋空值,防止后面的程序非法调用此指针。
程序代码少的时候可以不必理会。
程序复杂的时候 ...

哦,我明白了,不知道前辈有没有调用过fortran编写的Dll函数呢?也是返回指针的。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2013-8-21 13:46:07 | 显示全部楼层
haobang008 发表于 2013-8-21 13:30
哦,我明白了,不知道前辈有没有调用过fortran编写的Dll函数呢?也是返回指针的。

fortran或者C++你最好先深入学一种。
两种环境相互调用的情况
一方面需要你多花n倍的时间去做兼容测试,
另一方面使用fortran的指针不是很方便,且容易出错。
学习气象编程时候编译环境学一种:fortran、C++、C#、IDL、matlab、java等;
绘图学一种:grads、surfer、vis5d、vtk等;
网页学一种:*;
就占用你不少的时间了,混合编程也是有选择的混合的。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2013-8-21 13:57:22 | 显示全部楼层
本帖最后由 lyly061 于 2013-8-21 14:05 编辑
haobang008 发表于 2013-8-20 23:03
你看下,我是按照你的思路写出来的,你是这样想的吗?
04.    void fnArray(int* p, const int& nSize);
08.    int nSize = 10;
12.    for (int i=0; i < nSize; i++)
13.        cout<<p[ i]<<endl;
20.    void fnArray(int* p, const int& nSize);
24.    for (int i=0; i < nSize; i++)
25.        p[ i] = i;


密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

Copyright ©2011-2014 bbs.06climate.com All Rights Reserved.  Powered by Discuz! (京ICP-10201084)

本站信息均由会员发表,不代表气象家园立场,禁止在本站发表与国家法律相抵触言论

快速回复 返回顶部 返回列表