Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/16: Рейтинг темы: голосов - 16, средняя оценка - 4.88
1 / 1 / 0
Регистрация: 17.02.2010
Сообщений: 3
1

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

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

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

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

Если описывать массивы как динамические - программа работает через раз.. Если количество исходных точек невелико - скажем, 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.02.2010, 19:38
Ответы с готовыми решениями:

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

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

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

Повреждение кучи
#ifndef _TASK2_H_ #define _TASK2_H_ #include &lt;iostream&gt; using namespace std; namespace...

4
Автор FAQ
3687 / 964 / 114
Регистрация: 10.01.2010
Сообщений: 2,550
17.02.2010, 19:54 2
Дебаггер тыкает в 46 строку
Хм, ну вы же можете остановиться там (точка остановка) и посмотреть какие при этом k и j? Если они странные, то надо проходить вручную цикл проходить и смотреть из за чего возникает бага с этими переменными цикла
0
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
Автор FAQ
3687 / 964 / 114
Регистрация: 10.01.2010
Сообщений: 2,550
17.02.2010, 21:01 4
До боли знакомая тема... std::string, std::fstream, ошибка кучи Решилось можно сказать переписыванием почти с нуля)) Насчет выделения памяти - строки выделения памяти для двумерным массивов вгоняют меня в панику... так что тут помочь не могу. Самому интересно отчего такое происходит
0
1 / 1 / 0
Регистрация: 17.02.2010
Сообщений: 3
17.02.2010, 21:11  [ТС] 5
чорт.. вот ведь магия.. ладно.. попробую сделать 2д-массив по-другому..
0
17.02.2010, 21:11
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.02.2010, 21:11
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru