Программа перестала работать, когда попытался запустить - PullRequest
0 голосов
/ 13 июня 2018

Я написал программу для Лагранжевой интерполяции , которая выполняет компиляцию.К сожалению, когда я запускаю программу в Code Blocks , отображается только предупреждение «Программа перестала работать» .

В Dev-C ++ он возвращает значение свыше 32 000 000.

Можете ли вы проверить код и сказать мне, почему?Там у вас есть код:

#include <iostream>
#include<stdlib.h>
using namespace std;

struct wielo
{
    double a, b, c, d, e, f;
};

double *mnozenie(double A[], double B[], int m, int n)
{
    double *prod = new double[m + n - 1];

    for (int i = 0; i < m + n - 1; i++)
        prod[i] = 0;

    for (int i = 0; i < m; i++)
    {
        for (int j = 0; j < n; j++)
            prod[i + j] += A[i] * B[j];
    }

    return prod;
    delete prod;
}

int main()
{
    int wierz = 3; // max 6
    int sizeW = wierz - 1;
    double wynik = 0;
    double szukana = 5;
    double tabX[wierz];
    double tabY[wierz];
    double *tabTT;
    double wynikowy[wierz];

    tabX[0] = 1;
    tabX[1] = 2;
    tabX[2] = 4;

    tabY[0] = 3;
    tabY[1] = 4;
    tabY[2] = 6;

    wielo w[] =
    {
    { 0, 0, 0, 0, 0, 0 },
    { 0, 0, 0, 0, 0, 0 },
    { 0, 0, 0, 0, 0, 0 } };

    wynikowy[0] = 0.0;
    wynikowy[1] = 0.0;
    wynikowy[2] = 0.0;
    int k = 0;
    for (int i = 0; i < wierz; i++)
    {
        double dzialanie = 0;
        dzialanie = tabY[i];

        for (int j = 0; j < wierz; j++)
        {
            if (tabX[i] != tabX[j])
            {
                dzialanie *= (szukana - tabX[j]);
            }
        }

        for (int j = 0; j < wierz; j++)
        {
            if (tabX[i] != tabX[j])
            {
                dzialanie /= (tabX[i] - tabX[j]);
            }
            if (tabX[i] != tabX[j] && i < j)
            {
                double *tabT1;
                double *tabT2;
                tabT1[0] = 1;
                tabT1[1] = tabX[j] * (-1);
                tabT2[0] = 1;
                tabT2[1] = tabX[i] * (-1);
                tabTT = mnozenie(tabT1, tabT2, sizeW, sizeW);
                w[k].a = tabTT[0];
                w[k].b = tabTT[1];
                w[k].c = tabTT[2];
                k++;
            }
        }
        wynik += dzialanie;
        cout << dzialanie << endl;
    }
    double x, y, z;
    x = tabY[0] / ((tabX[0] - tabX[1]) * (tabX[0] - tabX[2]));
    y = tabY[1] / ((tabX[1] - tabX[0]) * (tabX[1] - tabX[2]));
    z = tabY[2] / ((tabX[2] - tabX[0]) * (tabX[2] - tabX[1]));
    for (int i = 0; i < wierz; i++)
    {
        if (i == 0)
        {
            wynikowy[0] = wynikowy[0] + (w[i].a * x);
            wynikowy[1] = wynikowy[1] + (w[i].b * x);
            wynikowy[2] = wynikowy[2] + (w[i].c * x);
        }
        if (i == 1)
        {
            wynikowy[0] = wynikowy[0] + (w[i].a * y);
            wynikowy[1] = wynikowy[1] + (w[i].b * y);
            wynikowy[2] = wynikowy[2] + (w[i].c * y);
        }
        if (i == 2)
        {
            wynikowy[0] = wynikowy[0] + (w[i].a * z);
            wynikowy[1] = wynikowy[1] + (w[i].b * z);
            wynikowy[2] = wynikowy[2] + (w[i].c * z);
        }

    }
    cout << "Wzor to: " << wynikowy[0] << "X^2 " << wynikowy[1] << "X " << wynikowy[2] << endl;
    cout << "Wynik dla x=" << szukana << " " << "y=" << wynik << endl;

    return 0;
}

1 Ответ

0 голосов
/ 13 июня 2018

У вас есть ваша главная проблема здесь.

double *tabT1;
double *tabT2;
tabT1[0]=1;
tabT1[1]=tabX[j]*(-1);
tabT2[0]=1;
tabT2[1]=tabX[i]*(-1);

Вы не выделили память, вместо этого вы только что объявили double ptrs tabT1 и tabT2 и получили доступ к ним, притворившись, что выделили.

double *tabT1 = new double[2];
double *tabT2 = new double[2];

исправит это, однако я настоятельно рекомендую вам вместо этого использовать умные указатели , что намного безопаснее в вашем случае, так как похоже, что у вас много массивов указателей.


Редактировать : вышеуказанное исправление приведет к утечке памяти, поскольку вы не будете беспокоиться об удалении этих массивов указателей после их использования каждый раз при завершении цикла for.Одним из возможных исправлений умного указателя может быть:

std::unique_ptr<double[]> tabTT = nullptr;  // change
.....
.....

if(tabX[i] != tabX[j] && i<j)
{
   std::unique_ptr<double[]> tabT1 = std::unique_ptr<double[]>(new double[2]);  // change
   std::unique_ptr<double[]> tabT2 = std::unique_ptr<double[]>(new double[2]);  // change
   .....
   .....
   tabTT = mnozenie(std::move(tabT1), std::move(tabT2),sizeW,sizeW);
   .....
}

И в функции:

auto mnozenie(std::unique_ptr<double[]> A, std::unique_ptr<double[]> B, int m, int n)
{
   std::unique_ptr<double[]> prod = std::unique_ptr<double[]>(new double[m+n-1]);
   // calculations....    
   return std::move(prod);
}

В качестве примечания : double tabX[wierz]; типобъявление (массив переменной длины) было запрещено в стандартах ISO C ++.Альтернатива - std::vector<>, которая также даст вам динамически распределенный непрерывный массив.

...