Stak around the variable was corrupted

140
27 августа 2019, 22:50

Такая вот проблема, пишу алгоритм для расчёта полинома Ньютона и сталкиваюсь с этой ошибкой

Вот код программы:

#include "pch.h"
#include <iostream>
#include <cmath>
#include <iomanip>
using namespace std;
const int n = 4; //константа разменрности массива
float lagranz(float X[n], float Y[n], float x); //объявление метода Лагранжа
float nuton(float X[n], float Y[n], float x); //объявление метода Ньютона
int main()
{
    setlocale(0, "");
    //Объявление массивов для значений X и Y
    float X[n];
    float Y[n];
    cout << "Количество узлов " << n;
    //Введение значений X в массив
    cout << "\nВведите массив чисел X\n";
    for (int i = 0; i < n; i++) {
        cin >> X[i];
    }
    //Введение значений Y в массив
    cout << "Введите массив чисел Y\n";
    for (int i = 0; i < n; i++) {
        cin >> Y[i];
    }
    float x;
    cout << "Введите число для проверки\n";
    cin >> x;
    int change;
    cout << "Выберите метод решения: 0-полином Лагранжа, 1-полином Ньютона\n";
    cin >> change;
    //Подсчёт полинома Лагранжа с заданным значениями
    if (change == 0) { cout << "\nL(" << x << ") = " << lagranz(X, Y, x) << " " << endl; }
    else if (change == 1) { cout << "\nP(" << x << ") = " << nuton(X, Y, x) << " " << endl; }
    else { cout << "Было указано неверное значение!"; }
}
//метод для подсчёта полинома Лагранжа
float lagranz(float X[n], float Y[n], float x) {                    //      
    float S, P; //переменные суммы и произведения                   //              
    S = 0;                                                          //      *
    for (int j = 0; j < n; j++) {                                   //      *                                                       
        P = 1;                                                      //      *
        for (int i = 0; i < n; i++) {                               //      M
            if (i != j) {                                           //      A
                P *= (x - X[i]) / (X[j] - X[i]);                    //      G
            }                                                       //      I
        }                                                           //      C
        S += Y[j] * P;                                              //      *
    }                                                               //      *
    return S;                                                       //      *
}                                                                   //      
float nuton(float X[n], float Y[n], float x) {
    float S, P, h, dY[n-1][n-2], fa, p1;
    h = X[1] - X[0];
    S = Y[0];
    fa = 1;
    for (int i = 0; i < n - 1; i++) {
        dY[i][0] = Y[i + 1] - Y[i];
    }
    int k = 1;
    for (int l = 0; l < n - 1; l++) {
        for (int o = 0; o < n; o++) {
            dY[o][k] = dY[o + 1][k - 1] - dY[o][k - 1];
        }
        k++;
    }
    p1 = 1;
    for (int i = 0; i < n - 1; i++) {
        fa *= (i + 1);
        p1 *= (x - X[i]);
        S += p1 * (dY[0][i] / (fa * pow(h, i + 1)));
    }
    return S;
}

P.S. Моё внимание привлекают незаполненные части массива dY из-за которого и вылетает

Answer 1

Выход за границы массива float dY[n-1][n-2]; здесь:

for (int o = 0; o < n; o++) {
    dY[o][k] = dY[o + 1][k - 1] - dY[o][k - 1];
} //              ^~~~~

и здесь:

for (int i = 0; i < n - 1; i++) {
    fa *= (i + 1);
    p1 *= (x - X[i]);
    S += p1 * (dY[0][i] / (fa * pow(h, i + 1)));
} //                 ^
READ ALSO
Стек, ошибка Access violation at address с разными размерами

Стек, ошибка Access violation at address с разными размерами

Дана задача: создать стек из чисел, найдти среднее арифметическое и удалить елементы меньше егоC++ Builder6

134
c++ вычислить значение выражения

c++ вычислить значение выражения

Во входном потоке задано три вещественных числа a (a > 0), b (b < 0), x (-1 < x < 1)Значения исходных данных подобраны так, что выражение имеет смысл

127
С++ олимпиадная задача

С++ олимпиадная задача

Старый пират Пью спрятал свое золото, но для надежности не в одном месте, а частями в нескольких тайникахНо чтобы не забыть места хранения...

112
C++ циклический сдвиг влево [закрыт]

C++ циклический сдвиг влево [закрыт]

Дан линейный массив на N элементовВыполнить циклический сдвиг всех его элементов на один влево начиная с первого нулевого элемента

111