| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3164 人关注过本帖
标题:类的成员函数返回值是指针,在调用时出现错误,请问是何原因?望赐教。
取消只看楼主 加入收藏
hsnr
Rank: 1
等 级:新手上路
帖 子:83
专家分:0
注 册:2010-4-4
结帖率:90.32%
收藏
已结贴  问题点数:10 回复次数:6 
类的成员函数返回值是指针,在调用时出现错误,请问是何原因?望赐教。
类的成员函数定义如下
double** Mmatrix::WMmatrix(int ielem)
{
    int Ngauss;
    double Posgp[10];
    double Weigp[10];
    int iNxd,jNyd,iG,jG;
    double dSum;
    double** pMtr;
    double JaDet,Weight;

    TwoArrayAllocation pT;
    pMtr=pT.TwoArrayDoubleAlloc((Nx+1)*(Ny+1),(Nx+1)*(Ny+1));

    XYandPhaiDifferential JD;

    GaussianQuadrature(Ngauss,Posgp,Weigp);

    for(iNxd=0;iNxd<(Nx+1)*(Ny+1);iNxd++)
    {
        for(jNyd=0;jNyd<(Nx+1)*(Ny+1);jNyd++)
        {
            dSum=0;

            for(iG=0;iG<Ngauss;iG++)
            {
                for(jG=0;jG<Ngauss;jG++)
                {
                    JaDet=JD.JacobiDeterminant(ielem,Posgp[iG],Posgp[jG]);
                    Weight=Weigp[iG]*Weigp[jG];
                    pMtr=SumforDegree(Posgp[iG],Posgp[jG]);

                    dSum+=pMtr[iNxd][jNyd]*Weight*JaDet;
                }
            }
            
            pMtr[iNxd][jNyd]=dSum;

            cout<<"pMtr["<<iNxd<<"]["<<jNyd<<"]="<<pMtr[iNxd][jNyd]<<endl;
        }
    }

    return(pMtr);

    pT.DoubleTwoArrayFree((Nx+1)*(Ny+1),pMtr);
}
调用的语句为
    double** paT;
    int i,j;

    Mmatrix aTem;
    paT=aTem.WMmatrix(0);
            
    for(j=0;j<(Nx+1)*(Ny+1);j++)
    {
        for(i=0;i<(Nx+1)*(Ny+1);i++)
        {
            cout<<"paT["<<i<<"]["<<j<<"]="<<paT[i][j]<<endl;
        }
按理说两次输出结果应该相同,可是事实不是一样的,百思不得其解。望论坛上的高手赐教。
搜索更多相关主题的帖子: 返回值 指针 函数 成员 
2010-04-19 19:55
hsnr
Rank: 1
等 级:新手上路
帖 子:83
专家分:0
注 册:2010-4-4
收藏
得分:0 
回二楼:
return(pMtr);
pT.DoubleTwoArrayFree((Nx+1)*(Ny+1),pMtr);这两句表示由于
TwoArrayAllocation pT;
    pMtr=pT.TwoArrayDoubleAlloc((Nx+1)*(Ny+1),(Nx+1)*(Ny+1));
将pMtr申明为一个二级指针,指向一个二维数组,返回之后要释放它,但我不清楚返回之后是不是就结束函数了,如果是这样,那要到哪释放它?TwoArrayDoubleAlloc和SumforDegree返回的都是二级指针。还有pMtr[iNxd][jNyd]不是二级指针所指向的元素的值吗?
2010-04-20 04:16
hsnr
Rank: 1
等 级:新手上路
帖 子:83
专家分:0
注 册:2010-4-4
收藏
得分:0 
谢谢二楼和四楼的解答,为了使您能更清晰地了解程序的问题,我把所有的对象传上来。如下:
double** Mmatrix::WMmatrix(int ielem)
{
    int Ngauss;
    double Posgp[10];
    double Weigp[10];
    int iNxd,jNyd,iG,jG;
    double dSum;
    double** pMtr;
    double JaDet,Weight;

    TwoArrayAllocation pT;
    pMtr=pT.TwoArrayDoubleAlloc((Nx+1)*(Ny+1),(Nx+1)*(Ny+1));

    XYandPhaiDifferential JD;

    GaussianQuadrature(Ngauss,Posgp,Weigp);

    for(iNxd=0;iNxd<(Nx+1)*(Ny+1);iNxd++)
    {
        for(jNyd=0;jNyd<(Nx+1)*(Ny+1);jNyd++)
        {
            dSum=0;

            for(iG=0;iG<Ngauss;iG++)
            {
                for(jG=0;jG<Ngauss;jG++)
                {
                    JaDet=JD.JacobiDeterminant(ielem,Posgp[iG],Posgp[jG]);
                    Weight=Weigp[iG]*Weigp[jG];
                    pMtr=SumforDegree(Posgp[iG],Posgp[jG]);

                    dSum+=pMtr[iNxd][jNyd]*Weight*JaDet;

                    cout<<"Weight="<<Weight<<endl;
                    cout<<"JacobiDeterminant="<<JaDet<<endl;
                    cout<<"pMtr_0["<<iNxd<<"]["<<jNyd<<"]="<<pMtr[iNxd][jNyd]<<endl;
                }
            }
            
            pMtr[iNxd][jNyd]=dSum;

            cout<<"pMtr["<<iNxd<<"]["<<jNyd<<"]="<<pMtr[iNxd][jNyd]<<endl;
        }
    }

    return(pMtr);

    pT.DoubleTwoArrayFree((Nx+1)*(Ny+1),pMtr);
}

double** TwoArrayAllocation::TwoArrayDoubleAlloc(int nRow,int nCol)
{
    pToDoubleMatrix=new double* [nRow];
    if(!pToDoubleMatrix)
    {
        cout<<"内存分配失败!"<<endl;
        exit(-1);
    }
    for(int j=0;j<nRow;j++)
    {
        pToDoubleMatrix[j]=new double [nCol];
        if(!pToDoubleMatrix)
        {
            cout<<"内存分配失败!"<<endl;
            exit(-1);
        }
    }
    return pToDoubleMatrix;
}

double** Mmatrix::SumforDegree(double ksi,double nda)
{
    int i,j,k,l,inode,jnode;
    double** pLM;
    double aPhai;
    double bPhai;

    TwoArrayAllocation pTwoArray;
    pLM=pTwoArray.TwoArrayDoubleAlloc((Nx+1)*(Ny+1),(Nx+1)*(Ny+1));

    XYandPhaiDifferential Phai;

    inode=0;
    for(i=0;i<=Nx;i++)
        {
            for(j=0;j<=Ny;j++)
                {
                    aPhai=Phai.InterpolationCoord(i,j,ksi,nda);

                    inode++;

                    jnode=0;
                    
                    for(k=0;k<=Nx;k++)
                        {
                            for(l=0;l<=Ny;l++)
                                {
                                    bPhai=Phai.InterpolationCoord(k,l,ksi,nda);

                                    jnode++;

                                    pLM[inode-1][jnode-1]=aPhai*bPhai;
//                                    cout<<"pLM["<<inode-1<<"]["<<jnode-1<<"]="<<pLM[inode-1][jnode-1]<<endl;

                                }
                        }
                }
        }
        
        return(pLM);

    pTwoArray.DoubleTwoArrayFree((Nx+1)*(Ny+1),pLM);
 
}

void Mmatrix::GaussianQuadrature(int& Ngauss,double Posgp[10],double Weigp[10])
{
    Ngauss=2;
    Posgp[0]=-0.577350269189626;
    Weigp[0]=1;
    Posgp[1]=0.577350269189626;
    Weigp[1]=1;
    return;
}
所有相关的模块就这些,如果我对二级指针理解错了,肯定上面这些模块也有同样的错误,那问题可大了!请指教。
2010-04-20 15:12
hsnr
Rank: 1
等 级:新手上路
帖 子:83
专家分:0
注 册:2010-4-4
收藏
得分:0 
把pLM[inode-1][jnode-1]=aPhai*bPhai;
改为
(*pLM)[inode-1][jnode-1]=aPhai*bPhai;编译时出现以下错误提示:
c:\Users\Documents\try\try.cpp(694) : error C2109: 下标要求数组或指针类型
请问,这是什么原因?
2010-04-20 22:17
hsnr
Rank: 1
等 级:新手上路
帖 子:83
专家分:0
注 册:2010-4-4
收藏
得分:0 
还是不行,编译出现“c:\\try\try.cpp(632): error C2100: 非法的间接寻址”的错误提示!快晕倒了!
2010-04-21 06:29
hsnr
Rank: 1
等 级:新手上路
帖 子:83
专家分:0
注 册:2010-4-4
收藏
得分:0 
说说这样试的理由,就是因为对二级指针不是很了解才出现这些问题的。
2010-04-22 06:59
hsnr
Rank: 1
等 级:新手上路
帖 子:83
专家分:0
注 册:2010-4-4
收藏
得分:0 
谢谢您的解释,可是我试过不行。
2010-04-23 08:23
快速回复:类的成员函数返回值是指针,在调用时出现错误,请问是何原因?望赐教。 ...
数据加载中...
 
   



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

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