Ошибка выполнения Unhandled exception
От: asd11  
Дата: 06.11.07 13:33
Оценка:
VC++ во время выполнения debug вылазит сообшение Unhandled exception и выполнение заканчивается
ошибка возникает при оканчание выполнения процедуры Init.

#include "stdafx.h"

#include <stdio.h>
#include<iostream>
#include<vector>
#include"MyMath.h"
using namespace std;


const int num=4;
typedef float typ;
typedef vector<double> MasD;
void main()
{
    CSpline dsa;
    MasD f;
    MasD e;
    for(int i=0;i<100;i++)
    {
        f.push_back(i);
        e.push_back(i);
    }
    dsa.Init(f,e);
}

//Mymath.h

#define MY_MATH_HHH

#include <vector>
#include "MyType.h"
void MethodProgon(int n,const MasD2& mas,MasD& rez);
class CSpline
{
private:
    MasD a,b,c,d;
    MasD x,y;
    int num;
    int qy;
    bool initial;
public:
    void Init(const MasD& x,const MasD& y);
    void ReturnSplineCoef(MasD& a,MasD& b,MasD& c,MasD& d);
    void ReturnExtrDate(MasD& x,MasD& y);
    double Mean(double x);
    CSpline();
};
double IntegRect(double x0,double xN,tFun fun,double precision);
double IntegRect(double x0,double xN,CSpline& fun,double precision);
#endif

//MyMath.cpp

#include "MyMath.h"
#include "iostream.h"
#include <math.h>

void MethodProgon(int n,const MasD2& mas,MasD& rez)
{

    std::vector<double> A(n-1),B(n-1),C(n-1);
    A[0]=-mas[0][1]/mas[0][0];
    B[0]=mas[0][n]/mas[0][0];
    for(int i=1;i<(n-1);i++)
    {
        double e=0.0;
        e=mas[i][i-1]*A[i-1]+mas[i][i];
        A[i]=-mas[i][i+1]/e;
        B[i]=(mas[i][n]-mas[i][i-1]*B[i-1])/e;
    }
    rez[n-1]=(mas[n-1][n]-mas[n-1][n-2]*B[n-2])/(mas[n-1][n-1]+mas[n-1][n-2]*A[n-2]);
    for(int i=n-2;i>=0;i--)
    {
        rez[i]=A[i]*rez[i+1]+B[i];
    }
}

CSpline::CSpline()
{
    initial=false;
}

void CSpline::Init(const MasD &x0,const MasD &y0)
{
    if(initial==true)
    {
        x.clear();
        y.clear();
        a.clear();
        b.clear();
        c.clear();
        d.clear();
    }
    initial=true;

    num=x0.size();
    for(int i=0;i<num;i++)
    {
        y.push_back(y0[i]);
        x.push_back(x0[i]);
        c.push_back(0);
        if(i!=(num-1))
        {
            a.push_back(y0[i]);
            b.push_back(0);
            d.push_back(0);
        }
    }
    MasD h(num-1);
    for(int i=0;i<num-1;i++)h[i]=x[i+1]-x[i];
    c[0]=0;
    c[num-1]=0;
    MasD2 mas(num-2);
    InitMasD2(mas,num-1,0);
    for(int i=0;i<num-2;i++)
    {
        if(i>0)mas[i][i-1]=h[i];
        mas[i][i]=2*(h[i]+h[i+1]);
        if(i<num-3)mas[i][i+1]=h[i+1];
        mas[i][num-2]=3*((y[i+2]-y[i+1])/h[i+1]-(y[i+1]-y[i])/h[i]);
    }
    MasD rezC(num-2);
    MethodProgon(num-2,mas,rezC);
    for(int i=1;i<num-1;i++)c[i]=rezC[i];
    for(int i=0;i<num-1;i++)
    {
        d[i]=(c[i+1]-c[i])/3/h[i];
        b[i]=(y[i+1]-y[i])/h[i]-h[i]*(c[i+1]+2*c[i])/3;
    }
}

double CSpline::Mean(double x0)
{
    double mean;
    for(int i=0;i<num-1;i++)
    {
        if((x0>=x[i])&&(x0<=x[i+1]))
        {
            mean=a[i]+b[i]*(x0-x[i])+c[i]*(x0-x[i])*(x0-x[i])
                +d[i]*(x0-x[i])*(x0-x[i])*(x0-x[i]);
            return mean;
        }
    }
    return 0;
}

void CSpline::ReturnSplineCoef(MasD& a0,MasD& b0,MasD& c0,MasD& d0)
{
    for(int i=0;i<a.size();i++)
    {
        a0.push_back(a[i]);
        b0.push_back(b[i]);
        c0.push_back(c[i]);
        d0.push_back(d[i]);
    }
}

void CSpline::ReturnExtrDate(MasD& x0,MasD& y0)
{
    for(int i=0;i<x.size();i++)
    {
        x0.push_back(x[i]);
        y0.push_back(y[i]);
    }
}


double IntegRect(double x0,double xN,tFun fun,double precision)
{
    double I,I0;
    I=(xN-x0)*fun((xN+x0)/2);
    int n=1;
    do
    {
        I0=I;
        I=0;
        n*=2;
        double deltaX=(xN-x0)/n;
        for(int i=0;i<n;i++)
        {
            I+=deltaX*fun(x0+deltaX/2+deltaX*i);
        }
    }
    while(fabs(I-I0)>precision);
    return I;
}


double IntegRect(double x0,double xN,CSpline& fun,double precision)
{
    double I,I0;
    I=(xN-x0)*fun.Mean((xN+x0)/2);
    int n=1;
    do
    {
        I0=I;
        I=0;
        n*=2;
        double deltaX=(xN-x0)/n;
        for(int i=0;i<n;i++)
        {
            I+=deltaX*fun.Mean(x0+deltaX/2+deltaX*i);
        }
    }
    while(fabs(I-I0)>precision);
    return I;
}

MyType.h

#ifndef MY_TYPE_HHH
#define MY_TYPE_HHH

#include<vector>
typedef std::vector<double> MasD;
typedef std::vector<MasD> MasD2;
typedef std::vector<MasD2> MasD3;
typedef double(*tFun)(double);
void InitMasD2(MasD2& mas1,int num,double mean);
//-----------------------------------------------------------------------------
class ExInitMasD2_ErroeSize{};
#endif

MyType.cpp

#include "MyType.h"


void InitMasD2(MasD2& mas1,int num,double mean)
{
    if ((mas1.size()<1)||(num<1))throw ExInitMasD2_ErroeSize();
    for(int i=0;i<(mas1.size());i++)
    {
        mas1[i].resize(num-1);
        for(int j=0;j<(num);j++) mas1[i][j]=mean;
    };
}

Исправлена разметка и сделана табуляция. — Кодт
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.