Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.12.2010, 23:10   #1
Gidross
 
Регистрация: 27.12.2010
Сообщений: 7
Печаль Run-Time Check Failure #2 - Stack around the variable 'a' was corrupted.

у меня вот такая проблема. я знаю что здесь на форуме это где то было. как я понял проблема в том что я вышел за пределы массива, да? только я никак не могу найти ошибку. прилагаю код. помогите найти ошибку.
Код:
// пользовательские функции
// меняем местами строки в массиве с коэфицентами уравнения
void exchange(float mas[3][3], int raz,int from, int to)
{
    for(int i=0; i < raz; i++)
	{
		mas[from][i] = mas[from][i] + mas[to][i];
		mas[to][i] = mas[from][i] - mas[to][i];
		mas[from][i] = mas[from][i] - mas[to][i];
	}
}
// определяем ближайшую строку с не 0 диоганалью вниз
int get_n_no_empty(float u[3][3], int raz, int begin)
{
	for(int p=begin; p < raz; p++)
	{
		if(u[p][p] != 0)
		{
		return p;
		}
	}
}
void CkursDlg::OnBnClickedButton2(){
// TODO: Add your control notification handler code here
int razmer=3; //размер матрицы
float   a[3][3],// матрица с коэфицентами
		d[3][3],//матрица, чтобы не было перегрузки
		x[3], // х
		b[3]; // свободные члены
int get_n;
/* Здесь нам надо присвоить значения матрице а, и заполнить свободные члены b */
a[0][0]=1;
a[0][1]=-1;
a[0][2]=-1;
a[1][0]=m_R1;
a[1][1]=m_R2;
a[1][2]=0;
a[2][0]=0;
a[2][1]=-m_R2;
a[2][2]=m_R3;
b[0]=0;
b[1]=m_E;
b[2]=0;
// начинаем решать)
// прямой проход
for(int k=0; k < razmer-1; k++) 	// идем слево на право по коэфицентам х
{
	for(int m=k+1; m < razmer; m++) // вычитаем по строкам
	{  
		if(a[m][m] == 0) 
		{
			get_n=get_n_no_empty(a, razmer, m);
			exchange(a, razmer, m,get_n);  // если на диагонали элемент = 0, то поменяем местами строки         
		}
		for(int r=0;r<3;r++)//копируем данные из матрицы a в матрицу d
		{
			for(int l=0;l<3;l++)
			{
				a[r][l]=d[r][l];
			};
		};
		float koeficent=d[m][k]/d[0][k];
		b[m] = b[m] - b[0] * koeficent;//вычисление новых коэфицентов уравнения
		for(int z=0; z < razmer; z++)
		{
			d[m][z] = d[m][k] - d[0][k] * koeficent;
		}

	}
}
// ищем решения
for(int m=razmer-1; m >= 0; m--)
{
	float sum=0;
	for(int i=razmer-1; i > m; i--)// идем по строке справо налево, считая сумму корень*коэфицент, до текущего корня
	{
		sum += x[i] * d[m][i];
	}
	x[m] = (b[m] - sum)/d[m][m];
}
m_U=1;
m_I1=x[0];
m_I2=x[1];
m_I3=x[2];
}
Gidross вне форума Ответить с цитированием
Старый 27.12.2010, 23:23   #2
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

1.
Код:
// определяем ближайшую строку с не 0 диоганалью вниз
int get_n_no_empty(float u[3][3], int raz, int begin)
{
	for(int p=begin; p < raz; p++)
Теряет вообще смысл. Потенциально опасно. Если делаете так float u[3][3] то тогда лучше так
Код:
nt get_n_no_empty(float u[3][3], int raz, int begin)
{
        if ((begin >= 0) && (raz < 3))
	for(int p=begin; p < raz; p++)
2. А хотя и в куче других мест аналогичный код (подход)
3. Обычно (хотя уже нет) в таких ситуациях, когда не ясно вообще где ошибка, просто комментируется все, и потом по логическим блокам раскоментировали - попробовали, если нет ошибки, идем дальше, если есть, ищем уже в маленьком куске кода, и так бесконечно закоментировали - попробовали, пока не дойдете до ошибки. Для меня очень действенный способ.
BOBAH13 вне форума Ответить с цитированием
Старый 27.12.2010, 23:29   #3
Gidross
 
Регистрация: 27.12.2010
Сообщений: 7
По умолчанию

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

Последний раз редактировалось Gidross; 27.12.2010 в 23:46.
Gidross вне форума Ответить с цитированием
Старый 28.12.2010, 00:33   #4
Gidross
 
Регистрация: 27.12.2010
Сообщений: 7
По умолчанию

может быть дело в том что get_n_no_empty не всегда возвращает значения?
Gidross вне форума Ответить с цитированием
Старый 28.12.2010, 00:38   #5
Gidross
 
Регистрация: 27.12.2010
Сообщений: 7
По умолчанию

блин, меня достала эта ошибка! я второй день мучаюсь. никак не пойму где может быть ошибка
хелп плиз
Gidross вне форума Ответить с цитированием
Старый 28.12.2010, 02:55   #6
Tony Parker
Пользователь
 
Регистрация: 19.12.2010
Сообщений: 52
По умолчанию

Gidross,

Да, get_n_no_empty не всегда возвращает значение. Если диагональ не найдена - то возвращает вообще random(int).

Побробуй:

Код:
int get_n_no_empty(float u[3][3], int raz, int begin)
{
	for(int p=begin; p < raz; p++)
	{
		if(u[p][p] != 0)
		{
		return p;
		}
	}
        return -1; // не нашли
}

...
if(a[m][m] == 0) 
		{
			get_n=get_n_no_empty(a, razmer, m);
			if (get_n > -1) exchange(a, razmer, m,get_n);  // если на диагонали элемент = 0, то поменяем местами строки         
		}
AllSuccess1.ru - каталог полезных курсов.
Tony Parker вне форума Ответить с цитированием
Старый 28.12.2010, 03:34   #7
Gidross
 
Регистрация: 27.12.2010
Сообщений: 7
По умолчанию

сделал как вы посоветовали, все равно показывает ту же самую ошибку
Gidross вне форума Ответить с цитированием
Старый 28.12.2010, 04:52   #8
Gidross
 
Регистрация: 27.12.2010
Сообщений: 7
По умолчанию

теперь все работает, но в мои едиты ничего не выводится. может в методе где ошибка?
Gidross вне форума Ответить с цитированием
Старый 28.12.2010, 05:01   #9
Gidross
 
Регистрация: 27.12.2010
Сообщений: 7
Злость

закоментил все кроме
m_U=1;
и... он ничего не вывел! хотя должен был вывести в едит единицу. в чем проблема тогда вообще
Gidross вне форума Ответить с цитированием
Старый 28.12.2010, 15:22   #10
Tony Parker
Пользователь
 
Регистрация: 19.12.2010
Сообщений: 52
По умолчанию

нужен остальной код и в нём смотреть вывод в edti-ы. Т.к. от приведённого выше остается только одна строчка m_U = 1;
AllSuccess1.ru - каталог полезных курсов.
Tony Parker вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ошибка - Run-time error '91' Object variable or With block variable not set Артур Иваныч Microsoft Office Excel 13 12.09.2012 14:18
Run-time error 13 olimpus Microsoft Office Excel 11 25.12.2010 22:49
Run-Time Check Failure #3 Xe[N]o Общие вопросы C/C++ 2 27.11.2010 09:01
un-time check failure #2-stack around the variable 't' was corrupted Despar Помощь студентам 1 13.05.2010 10:17
run-time check failure #2-stack around the variable 't' was corrupted Despar Общие вопросы C/C++ 1 13.05.2010 08:33