// 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();
}
Ошибка кучи (инициализация точки останова)
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
Выведенное на экран окно содержит дополнительные данные для диагностики ошибки
Как исправить?
Память точно выделяется и нигде не меняется указатель на неё?
Больше кода.
Вообще, всё работает.
Не работает при вводе первых начальных данных 2; 2 (значение переменной n_nov больше или равно 5) и если выбирать знаки больше или меньше (так как добавляется новые переменные). И даже при вашем приведенном примере, вылетает эта ошибка, только уже в конце
Конкретно на каких значениях появляется ошибка?
Код:
cout<<nach_baz[i]<<" ; ";
Цитата: Badabooom163
Количество переменных - 2, количество ограничений - 2. (хотя даже со значениями 2;1, как в приведенном Вами примере, в конце вылетает ошибка). Программа запускается при всех значениях. Лишь при попытке вывода значений
, вылетает данная ошибка кучи.
Код:
cout<<nach_baz[i]<<" ; ";
В C++ нумерация элементов массива начинается с НУЛЯ!!!!111
Код:
double *nach_baz;
nach_baz = new double [n_nov];
nach_baz = new double [n_nov];
Код:
cout<<nach_baz[n_nov]<<" )";
Код:
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]<<" ; ";
}
nach_baz = new double [n_nov];
for (int i=1; i<n_nov; i++)
{
nach_baz[i]=0;
cout<<nach_baz[i]<<" ; ";
}
Цитата: 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]<<" ; ";
}
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;//ББ следит за тобой
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;//ББ следит за тобой
Сделал, все равно ошибка.
Цитата: 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;
}
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.
Извини, но я понимаю, что так будет работать. Ошибка именно в программе в этом месте. И мне надо исправить, чтобы соответственно писать ее дальше. Крашится именно в выводе nach_baz
Код:
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]<<" ; ";
}
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]<<" ; ";
}
Ох, всем извините, а ошибка-то не там! Ошибка просто вылетает в конце программы. Почему только теперь понять не могу
Код:
delete [] dynamic_array;//ББ следит за тобой
Спасибо за внимание, но, к сожалению при удалении динамического массива вылезает еще больше программных ошибок
В каком месте массив удаляется?