| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 508 人关注过本帖
标题:指针与动态数组问题,求帮助
只看楼主 加入收藏
x6988312
Rank: 1
等 级:新手上路
帖 子:46
专家分:5
注 册:2012-3-26
结帖率:100%
收藏
已结贴  问题点数:10 回复次数:3 
指针与动态数组问题,求帮助
这是这个星期的实验题目,要求定义一个实数向量类Vector和一个矩阵类(Matrix),输出向量与矩阵,输出:  向量乘乘向量,矩阵乘矩阵,向量乘矩阵.
下面是我写的代码:
# include<iostream.h>
# include<stdlib.h>
# include<time.h>
class matrix;//声明矩阵类
class vector//定义向量类
{
    int m_cout;
    int *m_pdata;
    public:
    friend vector mutliply(matrix &m,vector &v);//友元
    vector(int n);
    vector();
    void show();
    int multiply(vector &v);
    ~vector();
};
class matrix//定义矩阵类
{
    int m_rows;
    int m_cols;
    float *m_pdata;
    public:
    friend vector mutliply(matrix &m,vector &v);
    matrix(int r,int c);
    matrix();
    void show();
    matrix multiply(matrix &m);
    ~matrix();
};
vector::vector(int n)//初始化向量,采用动态数组
{
    int i;
    m_pdata=new int[n];
    m_cout=n;
    for(i=0;i<n;i++)
        m_pdata[i]=0;
    for(i=0;i<n;i++)
    {
        m_pdata[i]=rand()%10+1;
    }
}
int vector::multiply(vector &v)//输出向量乘向量结果
{
    int i;
    int sum=1;
    for(i=0;i<m_cout;i++)
    {
        sum=sum*(v.m_pdata[i]);
    }
    cout<<"the number of vector is: "<<sum<<endl;
    return 0;
}
void vector::show()//输出向量
{
    int i;
    cout<<"the vector is:"<<endl;
    for(i=0;i<m_cout;i++)
    {
        cout<<m_pdata[i]<<" ";
    }
    cout<<endl;
}
vector::~vector()//析构函数,(用来删除动动态向量数组,这里可能是最后错误提示所在)
{
    delete this->m_pdata;
}
matrix::matrix(int r,int c)//初始化矩阵(这里我是采用一维数组作为矩阵,数组大小为 矩阵行 乘以 矩阵列)
{
    int i,j;
    m_rows=r;
    m_cols=c;
    m_pdata=new float[r*c];
    for(j=0;j<r*c;j++)
            m_pdata[j]=0;
    for(i=0;i<r*c;i++)
        m_pdata[i]=float(rand()%10+1);
}
matrix matrix::multiply(matrix &m)//输出矩阵乘矩阵
{
    int i,j,k;
    float temp=0;   
    if(m_rows==m_cols)
    {
        cout<<"the new matrix is:"<<endl;
        for(i=0;i<m_rows;i++)
        {
            for(k=0;k<m_rows;k++)

            {
                for(j=0;j<m_cols;j++)
                {
                    temp=temp+(m_pdata[m_cols*i+j])*(m_pdata[m_cols*j+k]);
                }
                cout<<temp<<" ";
                if(k==m_rows-1)
                cout<<endl;
            }
        }
    }
        
    else
        cout<<"can't jushuan"<<endl;
    return m;
}
void matrix::show()//输出矩阵
{
    int i;
    cout<<"the matrix is:"<<endl;
    for(i=0;i<m_rows*m_cols;i++)
    {
        cout<<m_pdata[i]<<" ";
        if((i!=0)&&(i%m_cols-1==0))
            cout<<endl;
    }
    cout<<endl;
}
matrix::~matrix()//析构函数(删除动态矩阵数组,这里可能是最后错误提示所在)
{
    delete this->m_pdata;
}
vector mutliply(matrix &m,vector &v)//输出向量乘矩阵(这里输出的是乱码)
{
    int i,j,k;
    float temp=0;
    k=m.m_cols;
    if(m.m_cols==v.m_cout)
    {
        cout<<"the new vector is:"<<endl;
        for(i=0;i<m.m_cols;i++)
        {
            for(j=0;j<v.m_cout;j++)
            {
                temp=temp+(v.m_pdata[j]) * (m.m_pdata[k*j+i]);
            }
            cout<<temp<<" ";
        }
        cout<<endl;
    }
    else
        cout<<"can't jishuan"<<endl;
    return v;
}
void main()
{
    int a,b,d;
    float i=0;
    srand((unsigned)time(NULL));
    cout<<"please input the vector cout and matrix row and col"<<endl;
    cin>>a>>b>>d;
    vector ab(a);
    ab.show();
    ab.multiply(ab);
    matrix bc(b,d);
    bc.show();
    bc.multiply(bc);
    mutliply(bc,ab);
}
这是我运行的结果:
图片附件: 游客没有浏览图片的权限,请 登录注册

从运行结果可以看出:
在输出矩阵时,排版有问题;
在输出向量乘矩阵时,乱码(小第找不原因所在,故求人帮助);
而且在程序结束时,会有错误提示,这个我想是析构函数的原因,但我打不错误所在.
搜索更多相关主题的帖子: 矩阵 matrix include Vector public 
2012-12-13 22:25
mmmmmmmmmmmm
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:8
帖 子:388
专家分:1809
注 册:2012-11-2
收藏
得分:10 
楼主 把两个类里面析构函数的delete语句删除就对了

原因是内存的重复释放 delete只能删除堆上内存, 栈上的内存, 是不需要手动来释放的

具体等版主来解答

我们的目标只有一个:消灭0回复!
while(1)
++money;
2012-12-14 10:15
x6988312
Rank: 1
等 级:新手上路
帖 子:46
专家分:5
注 册:2012-3-26
收藏
得分:0 
回复 2楼 mmmmmmmmmmmm
就算是用new伸请的内存空间也不用delete吗??
2012-12-14 17:56
x6988312
Rank: 1
等 级:新手上路
帖 子:46
专家分:5
注 册:2012-3-26
收藏
得分:0 
回复 2楼 mmmmmmmmmmmm
经过你的提示,我想了一下:
在我的这个程序里最后出错和乱码的原因我想大概是这样的:
由于在这个程序中,是最后调用的mutliply()函数,而动态数组的内存空间由于在mutliply()之前就已因为vector和martix的结束调用了析构函数,所以动态数组空间已被删除.因此,在最后输出的最后有乱码和错误提示的情况.
不知道是不是这样,具体的原因还是要版主来解释一下....
2012-12-14 18:07
快速回复:指针与动态数组问题,求帮助
数据加载中...
 
   



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

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