Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 20, средняя оценка - 4.65
Neibot
1 / 1 / 0
Регистрация: 17.02.2010
Сообщений: 3
#1

МНК, повреждение кучи - C++

17.02.2010, 19:38. Просмотров 2554. Ответов 4
Метки нет (Все метки)

Аппроксимация методом наименьших квадратов..

Если не использовать динамическую память, все работает замечательно..

Если описывать массивы как динамические - программа работает через раз.. Если количество исходных точек невелико - скажем, 5, то все хорошо.. Если например 20 - выкидывает - программа пытается записать данные за пределами кучи..

Что не так здесь в работе с динамической памятью?

Дебаггер тыкает в 46 строку..

код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
#include "stdafx.h"
#include "math.h"
#include "windows.h"
#include <iostream>
#include <fstream>
 
using namespace std;
 
char buffer[100];           
int n, m;
 
void main()
{
    AnsiToOem("Введи количество исходных точек: ", buffer);
    cout << buffer; cin >> n; cout << endl << endl;
    AnsiToOem("Введи желаемую степень полинома: ", buffer);
    cout << buffer; cin >> m; cout << endl << endl;
 
    long double *x=new long double [m+1], *y=new long double [m+1];
    long double **b=new long double *[m+1];
        for(int i=0; i<m+1; i++)
        b[i]=new long double[m+1];
    long double *c=new long double [m+1];
    long double *cr=new long double [m+1];
    
    ifstream inputfile("input.txt");
    if(!inputfile) 
    {
        AnsiToOem("Где входной файл??? >_<", buffer);
        cerr << buffer << endl << endl;
        AnsiToOem("Положи input.txt в одну директорию с этим exe-файлом..", buffer);
        cerr << buffer << endl << endl;
        system ("PAUSE");
        exit(1);
    }
    for(int i=0; i<n; i++)
    {
        inputfile >> x[i];
        inputfile >> y[i];
    }
 
    for(int k=0; k<m+1; k++)
    {
        for(int j=0; j<m+1; j++)
        {
            b[k][j]=0;
            for (int i=0; i<n; i++)
                b[k][j]+=pow(x[i], j+k);
        }
        c[k]=0;
        for(int i=0; i<n; i++)
            c[k]+=pow(x[i],k)*y[i];
    }
 
    for (int k=0; k<m; k++)
    {
        int imax=k;
        long double mx=b[k][k];
        for(int i=k; i<m+1; i++)        
            if(fabs(mx)<fabs(b[i][k]))
            {
                mx=b[i][k];
                imax=i;
            }
 
        mx=c[k];        
        c[k]=c[imax];
        c[imax]=mx;
 
        for(int j=k; j<m+1; j++)
        {
            mx=b[k][j];     
            b[k][j]=b[imax][j];
            b[imax][j]=mx;
        }
        
        for(int i=k+1; i<m+1; i++)          
        {
            for(int j=k; j<m+1; j++)
                b[i][j]-=b[k][j]*b[i][k]/b[k][k];
            c[i]-=c[k]*b[i][k]/b[k][k];
            b[i][k]=0;
        }
    }
 
    for(int i=0; i<m+1; i++)                    
        cr[i]=c[i];
    for(int i=m; i>=0; i--)
    {
        for(int j=i+1; j<m+1; j++)
            cr[i]-=b[i][j]*cr[j];
        cr[i]=cr[i]/b[i][i];
    }
        
    AnsiToOem("Найденные решения СЛАУ:", buffer);
    cout << endl << endl << buffer << endl << endl;
    for(int i=0; i<m+1; i++)
    {
        AnsiToOem("Корень №", buffer);
        cout << buffer << i+1 << ": " << cr[i] << endl;
    }
    cout << endl << endl;
    system ("PAUSE");
    system ("cls");
 
    delete[] x,y,b,c,cr; 
 
}
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.02.2010, 19:38
Я подобрал для вас темы с готовыми решениями и ответами на вопрос МНК, повреждение кучи (C++):

Повреждение кучи - C++
Приветствую! Сделал, казалось бы, простую программу, но у меня возникает ошибка на самом ровном месте: void print(node** graph, int V) ...

Повреждение кучи - C++
После выполнения программы выдаёт ошибку Debug Assertion Failed Помогите найти и исправить место из-за которого ошибка, я так понимаю она...

Повреждение кучи - C++
#ifndef _TASK2_H_ #define _TASK2_H_ #include &lt;iostream&gt; using namespace std; namespace TeamResult { static int...

Повреждение кучи - C++
Есть код #include &lt;iostream&gt; using namespace std; struct STUDENT { char NAME; int GROUP; int SES; };

Странное повреждение кучи - C++
Доброго времени суток, форумчане! Есть проект, в нем реализована функцию дублирования всех элементов статического массива с...

Ошибка о повреждение кучи - C++
Вот переделал программу со строками, с использованием классов. Почему-то опять возникает ошибка о повреждение кучи. Не могу понять где...

4
insideone
Модератор
Автор FAQ
3652 / 932 / 54
Регистрация: 10.01.2010
Сообщений: 2,499
17.02.2010, 19:54 #2
Дебаггер тыкает в 46 строку
Хм, ну вы же можете остановиться там (точка остановка) и посмотреть какие при этом k и j? Если они странные, то надо проходить вручную цикл проходить и смотреть из за чего возникает бага с этими переменными цикла
0
Neibot
1 / 1 / 0
Регистрация: 17.02.2010
Сообщений: 3
17.02.2010, 20:52  [ТС] #3
Все значения нормальные..
Да и с чего бы k и j быть ненормальными, если они только что перед этим задавались..

Еще раз скажу - тут однозначно дело в выделении памяти, но я не могу понять, что не так.. Почему и спрашиваю..

Место спотыкания программы может быть разным - зависит от исходных данных, как я и писал..

Вот щас - дебаггер ткнулся в tidtable.c, строка
PFLS_GETVALUE_FUNCTION flsGetValue = FLS_GETVALUE;

MSVS при этом выдает

ОС Windows инициировала точку останова в MNK2.exe.

Это может быть вызвано повреждением кучи и указывает на ошибку в MNK2.exe или в одной из загруженных им DLL.

Возможной причиной так же может быть нажатие пользователем клавиши F12, когда фокус принадлежит MNK2.exe

Выведенное на экран окно содержит дополнительные данные для диагностики ошибки
0
insideone
Модератор
Автор FAQ
3652 / 932 / 54
Регистрация: 10.01.2010
Сообщений: 2,499
17.02.2010, 21:01 #4
До боли знакомая тема... std::string, std::fstream, ошибка кучи Решилось можно сказать переписыванием почти с нуля)) Насчет выделения памяти - строки выделения памяти для двумерным массивов вгоняют меня в панику... так что тут помочь не могу. Самому интересно отчего такое происходит
0
Neibot
1 / 1 / 0
Регистрация: 17.02.2010
Сообщений: 3
17.02.2010, 21:11  [ТС] #5
чорт.. вот ведь магия.. ладно.. попробую сделать 2д-массив по-другому..
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.02.2010, 21:11
Привет! Вот еще темы с ответами:

Точка останова(повреждение кучи) - C++
Прошу помочь, смотрел по форуму похожие темы - ответа не нашел void Base::Read() { char* name=new char;//переменная для имени ...

C++ delete[] точка останова/повреждение кучи - C++
Добрый день. Подскажите, пожалуйста. Вот код функции: void interpol(point* a, int n, int k, point* y, int inter) //a-original ...

Повреждение кучи при создании нейросети с количеством слоев больше 51 - C++
Добрый день. Я знаю, таких тем уже много, я их прочитала, но ни в одной не нашла решения моей проблемы. Проблема. Есть нейронная сеть...

Ошибка при "сборе мусора" . Повреждение кучи - C++
Привет ребята! Я совсем скверно знаю плюсы и не смотря на несколько лет довольно успешной работы в ИТ так и не заставил себя заниматься...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru