Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Ошибка кучи (инициализация точки останова)

82K
19 июня 2012 года
Badabooom163
9 / / 19.06.2012
Вот часть программы (n_nov=5), в которой ошибка (притом появляется только при попытке вывода)
double *nach_baz;
nach_baz = new double [n_nov];

for (a=1; a<n_nov; i++)
{
nach_baz[a]=0;
cout<<nach_baz [a]<<" ; ";
}
Ошибка:
ОС Windows инициировала точку останова в simpmeth.exe.

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

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

Выведенное на экран окно содержит дополнительные данные для диагностики ошибки
Как исправить?
414
19 июня 2012 года
CassandraDied
763 / / 24.05.2012
Код оформляется тегом [сode] [/сode]
Память точно выделяется и нигде не меняется указатель на неё?
Больше кода.
82K
19 июня 2012 года
Badabooom163
9 / / 19.06.2012
Код:
// simpmeth_Frolov.cpp: определяет точку входа для консольного приложения.
//

#include "stdafx.h"
#include <iostream>
#include <conio.h>
using namespace std;

struct stru
{
    double *koef;
    char ch;
    double svch, bazis, baz_koef,baz_resh, delta, z,otvet;
};

int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(LC_CTYPE,"RUS");
    int i,j,n,n1,n_nov, max_n, steps=0, vybor=0, r_str;
        cout<<"Введите количество переменных  ";
    cin>>n;
    cout<<"\n\nВведите количество ограничений  ";
    cin>>n1;
        max_n=n+n1*2;
    stru *tabl;
    tabl= new stru [(n1)+1];
   
    for (i=1; i<=n1+1; i++)
        tabl[i].koef = new double [max_n];
    cout<<"\n\nЦЕЛЕВАЯ ФУНКЦИЯ имеет вид: ";
    for (i=1; i<=n-1; i++)                 
    cout<<"А"<<i<<" * Х"<<i<<" + ";
    cout<<"А"<<n<<" * Х"<<n<<" + Z1\n\n";
    for (i=1; i<=n; i++)
    {
        cout<<"Введите коэффициент А"<<i<<" : ";
        cin>>tabl[1].koef[i];
        cout<<"\n";
    }
    cout<<"Введите коэффициент Z1 : ";
    cin>>tabl[1].svch;
    for (j=2; j<=n1+1; j++)
    {
    cout<<"\n\n"<<j<<" ОГРАНИЧЕНИЕ\n\n";
    cout<<"Введите знак ограничения ( > < = ) : ";
    cin>>tabl[j].ch;
    cout<<"\nОграничение имеет вид: ";
    for (i=1; i<=n-1; i++)                 
    cout<<"B"<<i<<" * Х"<<i<<" + ";
    cout<<"B"<<n<<" * Х"<<n<<" "<<tabl[j].ch<<" Z"<<j<<"\n\n";
    for (i=1; i<=n; i++)
    {
        cout<<"Введите коэффициент B"<<i<<" : ";
        cin>>tabl[j].koef[i];
        cout<<"\n";
    }
    cout<<"Введите коэффициент Z"<<j<<" : ";
    cin>>tabl[j].svch;
    }
        cout<<"\n\nПОЛУЧИЛИ ЗАДАЧУ:\n";
    for (i=1; i<=n-1; i++)                 
    cout<<"("<<tabl[1].koef[i]<<" * Х"<<i<<") + ";
    cout<<"("<<tabl[1].koef[n]<<" * Х"<<n<<") + (" <<tabl[1].svch<<") -> max\n";
    for (j=2; j<=n1+1; j++)
    {
        for (i=1; i<=n-1; i++)                 
    cout<<"("<<tabl[j].koef[i]<<" * Х"<<i<<") + ";
    cout<<"("<<tabl[j].koef[n]<<" * Х"<<n<<") "<<tabl[j].ch<<" "<<tabl[j].svch<<"\n";
    }
    n_nov = n;
    for (i=2; i<=n1+1; i++)
    {
    if (tabl[i].ch=='<')
        {  
        tabl[i].koef[n_nov+1]=1;
        tabl[1].koef[n_nov+1]=0;
        tabl[i].bazis=n_nov+1;     
        tabl[i].baz_koef=0;
        n_nov+=1;
        for (j=n+1; j<=max_n; j++)
            {
            if (j!=n_nov)
                tabl[i].koef[j]=0;
            }
        }
    else
        {
            if (tabl[i].ch=='>')
                {                  
                    tabl[i].koef[n_nov+1]=-1;
                    tabl[i].koef[n_nov+2]=1;
                    tabl[1].koef[n_nov+1]=0;
                    tabl[1].koef[n_nov+2]=-1000;
                    tabl[i].bazis=n_nov+2;
                    tabl[i].baz_koef=-1000;
                    n_nov+=2;
                    for (j=n+1; j<=max_n; j++)
                            {
                            if ((j!=n_nov)&&(j!=n_nov-1))
                                tabl[i].koef[j]=0;
                            }
                }
        else
        {
            if (tabl[i].ch=='=')
            {
                tabl[i].koef[n_nov+1]=1;
        tabl[1].koef[n_nov+1]=-1000;
        tabl[i].bazis=n_nov+1;
        tabl[i].baz_koef=-1000;
        n_nov+=1;
        for (j=n+1; j<=max_n; j++)
            {
            if (j!=n_nov)
                tabl[i].koef[j]=0;
            }
            }
        }

        }

    }
    cout<<"\n\nВВЕДЕМ ДОПОЛНИТЕЛЬНЫЕ ПЕРЕМЕННЫЕ:\n";
    for (i=1; i<=n_nov-1; i++)                 
    cout<<"("<<tabl[1].koef[i]<<" * Х"<<i<<") + ";
    cout<<"("<<tabl[1].koef[n_nov]<<" * Х"<<n_nov<<") + (" <<tabl[1].svch<<") -> max\n";

    for (j=2; j<=n1+1; j++)
    {
        for (i=1; i<=n_nov-1; i++)                 
    cout<<"("<<tabl[j].koef[i]<<" * Х"<<i<<") + ";
    cout<<"("<<tabl[j].koef[n_nov]<<" * Х"<<n_nov<<") = "<<tabl[j].svch<<"\n";
    }  
    cout<<"\n\nПОЛУЧЕННЫЕ БАЗИСНЫЕ ПЕРЕМЕННЫЕ: ";
    for (i=2; i<=n1+1; i++)    
        cout<<"x["<<tabl[i].bazis<<"]   ";
    /////////////////////////////////////////////////
    int tmp;
    double *nach_baz;
    nach_baz = new double [n_nov];

    for (int i=1; i<n_nov; i++)
    {          
        nach_baz[i]=0; 
        cout<<nach_baz[i]<<" ; ";
    }

    for (i=1; i<=n1; i++)
    {
        tmp=tabl[i+1].bazis;
        nach_baz[tmp]=tabl[i+1].svch;
        tabl[i+1].baz_resh=tabl[i+1].svch;
    }


    cout<<"\n\nНачальное базисное решение: ";
    cout<<"(  ";
    for (i=1; i<n_nov; i++)    
        cout<<nach_baz[i]<<" ; ";
    cout<<nach_baz[n_nov]<<" )";


    getch();
}
414
19 июня 2012 года
CassandraDied
763 / / 24.05.2012
Кривые входные данные. Нельзя вводить отрицательные значения, когда запрашивается количество переменных. В их количестве выделяется память под массив. Советую рядом со всеми участками выделения памяти поставить проверку, какая размерность у массива под выделяемый участок. После выделения поставить проверку, действительно ли память выделилась. Везде.
Вообще, всё работает.
82K
19 июня 2012 года
Badabooom163
9 / / 19.06.2012
Не работает при вводе первых начальных данных 2; 2 (значение переменной n_nov больше или равно 5) и если выбирать знаки больше или меньше (так как добавляется новые переменные). И даже при вашем приведенном примере, вылетает эта ошибка, только уже в конце
414
19 июня 2012 года
CassandraDied
763 / / 24.05.2012
Конкретно на каких значениях появляется ошибка?
82K
19 июня 2012 года
Badabooom163
9 / / 19.06.2012
Количество переменных - 2, количество ограничений - 2. (хотя даже со значениями 2;1, как в приведенном Вами примере, в конце вылетает ошибка). Программа запускается при всех значениях. Лишь при попытке вывода значений
 
Код:
cout<<nach_baz[i]<<" ; ";
, вылетает данная ошибка кучи.
277
19 июня 2012 года
arrjj
1.7K / / 26.01.2011
Цитата: Badabooom163
Количество переменных - 2, количество ограничений - 2. (хотя даже со значениями 2;1, как в приведенном Вами примере, в конце вылетает ошибка). Программа запускается при всех значениях. Лишь при попытке вывода значений
 
Код:
cout<<nach_baz[i]<<" ; ";
, вылетает данная ошибка кучи.



В C++ нумерация элементов массива начинается с НУЛЯ!!!!111

 
Код:
double *nach_baz;
    nach_baz = new double [n_nov];
Последний элемент nach_baz[n_nov-1]. А ты выводишь:
 
Код:
cout<<nach_baz[n_nov]<<" )";
Пересмотри полностью код и исправь нумерацию.
82K
19 июня 2012 года
Badabooom163
9 / / 19.06.2012
 
Код:
double *nach_baz;
    nach_baz = new double [n_nov];

    for (int i=1; i<n_nov; i++)
    {          
        nach_baz[i]=0;  
        cout<<nach_baz[i]<<" ; ";
    }
Начальный пост, даже здесь вылетает эта ошибка, хотя по идее все правильно и выводится только то, чему придано значение
277
19 июня 2012 года
arrjj
1.7K / / 26.01.2011
Цитата: Badabooom163
 
Код:
double *nach_baz;
    nach_baz = new double [n_nov];

    for (int i=1; i<n_nov; i++)
    {          
        nach_baz[i]=0;  
        cout<<nach_baz[i]<<" ; ";
    }
Начальный пост, даже здесь вылетает эта ошибка, хотя по идее все правильно и выводится только то, чему придано значение



 
Код:
double *nach_baz;
    nach_baz = new double [n_nov];

    for (int i=0; i<n_nov; i++)//!! с нуля
    {          
        nach_baz[i]=0;  
        cout<<nach_baz[i]<<" ; ";
    }
delete [] nach_baz;//ББ следит за тобой
82K
19 июня 2012 года
Badabooom163
9 / / 19.06.2012
Сделал, все равно ошибка.
277
19 июня 2012 года
arrjj
1.7K / / 26.01.2011
Цитата: Badabooom163
Сделал, все равно ошибка.


Код:
#include <iostream>
using namespace std;
int main()
{
int n_nov=0;
cin>>n_nov;
if(n_nov <=0 )
    return 1;
double *nach_baz;
    nach_baz = new double [n_nov];

    for (int i=0; i<n_nov; i++)//!! с нуля
    {          
        nach_baz[i]=0;  
        cout<<nach_baz[i]<<" ; ";
    }
delete [] nach_baz;//ББ следит за тобой
return 0;
}
Чето вспомнилось:
Цитата:

-pizdish.
-blya budu.

82K
19 июня 2012 года
Badabooom163
9 / / 19.06.2012
Извини, но я понимаю, что так будет работать. Ошибка именно в программе в этом месте. И мне надо исправить, чтобы соответственно писать ее дальше. Крашится именно в выводе nach_baz
277
19 июня 2012 года
arrjj
1.7K / / 26.01.2011
И чему у тебя равен n_nov?
 
Код:
double *nach_baz;
cout<<"n_nov="<<n_nov<<endl;
    nach_baz = new double [n_nov];

    for (int i=0; i<n_nov; i++)//!! с нуля
    {          
        nach_baz[i]=0;  
        cout<<nach_baz[i]<<" ; ";
    }
82K
19 июня 2012 года
Badabooom163
9 / / 19.06.2012
Ох, всем извините, а ошибка-то не там! Ошибка просто вылетает в конце программы. Почему только теперь понять не могу
277
19 июня 2012 года
arrjj
1.7K / / 26.01.2011
Потому что убирать за собой надо все динамические массивы
 
Код:
delete [] dynamic_array;//ББ следит за тобой
Или в релиз версию собрать - тогда отстанет.
82K
19 июня 2012 года
Badabooom163
9 / / 19.06.2012
Спасибо за внимание, но, к сожалению при удалении динамического массива вылезает еще больше программных ошибок
414
19 июня 2012 года
CassandraDied
763 / / 24.05.2012
Каких?
В каком месте массив удаляется?
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог