造船工人 2017-10-20 09:14 采纳率: 100%
浏览 972
已采纳

c++程序调试了好久总是出错,好像是指针的问题

    初学,想实现n阶线性方程组求解。从txt文件中读入A矩阵和b,求解后将结果输出到另一个txt文件。
    调试过程很奇怪,有时不会有问题,有时会报错。我单步执行时会在main函数return时出现断点,百度了一下,好像跟内存溢出什么的有关,没能看得很明白。请问是哪里出了问题。
 #include <iostream>
#include <fstream>
#include <string>
#include <stdlib.h>
using namespace std;

class equation
{
public:
    int n;
    double ** A = new double *[n];          //系数阵
    double *b = new double[n];              //常数项
    double *x = new double[n];
    void solve();
    void DisplayEquation();
    void DisplayResult();
    void input();
    void output();
    equation()
    {
        n = 0;
    }
    equation(int a)
    {
        n = a;
    }
};

int CountLines()                                                    //统计系数阵阶数
{
    int n = 0;
    string temp;
    fstream f;
    f.open("equation.txt", ios::in);
    if (f.fail())
    {
        cout << "打开文件失败\n";
    }
    else
    {
        while (getline(f, temp))
        {
            if (temp[0] == '#')
                break;
            n++;
        }
    }
    f.close();
    return n;
}

void equation::input()
{
    int t, i = 0, j = 0;
    string temp;
    fstream f;
    f.open("equation.txt", ios::in);
    while (getline(f, temp, '   '))                     //从文件读入系数矩阵到A中
    {
        t = temp.find('\n');
        if (t > -1)
            temp.erase(t, sizeof('\n'));
        if (temp[0] == '#')
            break;
        else
        {
            if (j == n - 1)
            {
                A[i][j] = atof(temp.c_str());
                j = 0;
                i++;
            }
            else
            {
                A[i][j] = atof(temp.c_str());
                j++;
            }
        }
    }
    i = 0;
    while (getline(f, temp, '   ') && !f.eof())         //从文件读入常数项到b中
    {
        t = temp.find('\n');
        if (t > -1)
            temp.erase(t, sizeof('\n'));
        b[i] = atof(temp.c_str());
        i++;
    }
//  f.close();  //这里加这东西居然会报错
}

void equation::DisplayEquation()                            //显示系数矩阵与常数向量
{
    cout << "系数矩阵为:\n";
    for (int i = 0; i < n; i++)
        for (int j = 0; j < n; j++)
        {
            if (j == n - 1)
                cout << A[i][j] << "\t\n";
            else
                cout << A[i][j] << "\t";
        }
    cout << "\n常数项为:\n";

    for (int i = 0; i < n; i++)
        cout << b[i] << "\n";
}

void equation::solve()                                              //求解方程,将解存入x中
{
    double c;
    //================================forward elimination==================================
    for (int k = 0; k < n; k++)
    {
        for (int i = k + 1; i < n; i++)
        {
            c = A[i][k] / A[k][k];
            for (int j = k; j < n; j++)
                A[i][j] = A[i][j] - A[k][j] * c;
            b[i] = b[i] - b[k] * c;
        }
    }
    //==========================back substitution==========================================
    double sum;
    x[n - 1] = b[n - 1] / A[n - 1][n - 1];
    for (int i = n - 2; i >= 0; i--)
    {
        sum = 0;
        for (int j = n - 1; j >= i + 1; j--)
            sum = sum + A[i][j] * x[j];
        x[i] = (b[i] - sum) / A[i][i];
    }
}

void equation::DisplayResult()
{
    cout << "方程的解为:\n";
    for (int i = 0; i < n; i++)
        cout << x[i] << "   ";
    cout << endl;
}

void equation::output()
{
    fstream r;
    r.open("result.txt", ios::out);
    if (r.fail())
    {
        cout << "打开文件失败\n";
        exit(1);
    }
    for (int i = 0; i < n; i++)
    {
        r << "X" << i << "=" << x[i] << "\n";
    }
    r.close();
}

int main()
{
    int N, j = 0;
    string temp, a;
    N = CountLines();
    equation e1(N);
    for (int i = 0; i < N; i++)
        e1.A[i] = new double[N];
    e1.input();
    //  e1.DisplayEquation();
    e1.solve();
//  e1.DisplayEquation();                               //上三角矩阵
//  e1.DisplayResult();
    e1.output();
    return 0;
}

刚注册的账号,没有C币。。。

  • 写回答

3条回答 默认 最新

  • JasBin2008 2017-10-21 13:28
    关注

    class equation
    {
    public:
    int n;
    double ** A = new double *[n]; //系数阵
    double *b = new double[n]; //常数项
    double *x = new double[n];
    void solve();
    void DisplayEquation();
    void DisplayResult();
    void input();
    void output();
    equation()
    {
    n = 0;
    }
    equation(int a)
    {
    n = a;
    }
    };

    两点问题:
    1)构造函数equation(){n=0;}会生成一个长度为0的数组,编译不会抛错,也会返回一个正常的数组指针,但是如果修改了指针会
    导致内存被破坏,恰巧这块内存正在使用,就会抛出异常,也就会崩!
    2)建议申请的内存最好在析构函数内释放掉。。。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?
  • ¥15 求daily translation(DT)偏差订正方法的代码
  • ¥15 js调用html页面需要隐藏某个按钮