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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 10.03.2012, 05:14   #1
sidestep
Пользователь
 
Регистрация: 14.09.2011
Сообщений: 93
По умолчанию Ошибка Stack around the variable '' was corrupted.

Написал программу, которая считает кол-во треугольников, образованными пересекающими линиями на плоскости


Вот код:
Код:
#include <stdio.h>
#include <conio.h>
const int N=4;
const int P = (N*(N-1))/2;
float matrix[N][3];

int main() {  

	for (int i = 0; i < N; i++) {
		for (int j = 0; j < 3; j++) {
			scanf("%f", &matrix[i][j]); //вводим коэффициенты a,b и c уравнений вида  a*x +b*y+c=0
		}
	}
	int count_toch = 0;
	int count_treu = 0;
	int ploxo = 0;

	float tochka[P][2];
	for (int beg = 0; beg < N; beg++) {
		for (int i = beg + 1; i < N; i++) {
			// находим первую прямую с которой пересекается пробегающая
			if (matrix[i][1]*matrix[beg][0] != matrix[i][0]*matrix[beg][1]) {
				tochka[count_toch][0] = (matrix[beg][1]*matrix[i][2] - matrix[i][1]*matrix[beg][2])/(matrix[i][1]*matrix[beg][0] - matrix[i][0]*matrix[beg][1]); 
				tochka[count_toch][1] = (-matrix[beg][2]-matrix[beg][0]*tochka[count_toch][0])/matrix[beg][1];

				//printf("\n%f   %f", tochka[count_toch][0], tochka[count_toch][1]);
				count_toch++;

				// находим прямую, с которой пересекаются и пробегающая и пересекающая пробегающую
				for (int j = i + 1; j < N; j++) {
					if (matrix[i][1]*matrix[beg][0] != matrix[i][0]*matrix[beg][1] && 
						matrix[j][1]*matrix[beg][0] != matrix[j][0]*matrix[beg][1] &&
						matrix[i][1]*matrix[j][0] != matrix[i][0]*matrix[j][1]
					) {
						// ищем точку пересечения первой с третьей прямой
						tochka[count_toch][0] = (matrix[beg][1]*matrix[j][2] - matrix[j][1]*matrix[beg][2])/(matrix[j][1]*matrix[beg][0] - matrix[j][0]*matrix[beg][1]);
						tochka[count_toch][1] = (-matrix[beg][2]-matrix[beg][0]*tochka[count_toch][0])/matrix[beg][1];
						count_toch++;

						// ищем точку пересечения второй с третьей
						tochka[count_toch][0] = (matrix[i][1]*matrix[j][2] - matrix[j][1]*matrix[i][2])/(matrix[j][1]*matrix[i][0] - matrix[j][0]*matrix[i][1]);
						tochka[count_toch][1] = (-matrix[i][2]-matrix[i][0]*tochka[count_toch][0])/matrix[i][1];


						if ((tochka[count_toch-1][0] != tochka[count_toch][0] && tochka[count_toch-1][1] != tochka[count_toch][1]) 
							|| (tochka[count_toch-1][0] != tochka[count_toch-2][0] && tochka[count_toch-1][1] != tochka[count_toch-2][1]) 
							|| (tochka[count_toch-2][0] != tochka[count_toch][0] && tochka[count_toch-2][1] != tochka[count_toch][1])) {
								count_treu++;
								ploxo ++;
								printf("\n%i treugolnuik: (%f, %f), (%f, %f), (%f, %f)", count_treu, tochka[count_toch-2][0], tochka[count_toch-2][1],
									tochka[count_toch-1][0], tochka[count_toch-1][1],
									tochka[count_toch][0], tochka[count_toch][1]);
						} else {
							//ploxo = 0;
						}
						count_toch++;
					}
				}

			} 
		} 
	}

	if (ploxo = 0) {
		printf("\nnetu treugolnikov");
	}

	getch();
	return 0;
}


Но выдает ошибку Stack around the variable 'tochka' was corrupted.
Как исправить?
sidestep вне форума Ответить с цитированием
Старый 10.03.2012, 09:28   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Попробуй сделать эту переменную глобальной.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 10.03.2012, 11:33   #3
sidestep
Пользователь
 
Регистрация: 14.09.2011
Сообщений: 93
По умолчанию

Проблема 1:
Когда я печатаю координаты точек своего треугольника, то моя первая координата зависит от внешнего цикла, когда я делаю "откат"
Код:
tochka[count_toch-2][0], tochka[count_toch-2][1]
то первая тройка моего ответа будет верной, но вторая уже идет со сдвигом, то есть 1 координата моей следующей тройки будет координатой последней координаты предыдущей тройки
Как это исправить?

Я попробовал зависти переменную типа int
Код:
begynok
затем придать ей значение 0 тут:
Код:
int count_toch = 0;
	int count_treu = 0;
	int ploxo = 0;
        int begynok = 0;
Затем делать в выводе
Код:
tochka[count_toch-2-begynok][0], tochka[count_toch-2-begynok][1]
Но надо теперь ее увеличивать каждый раз, но вот только в каком месте я не могу понять? На мой взгляд надо тут:
Код:
} else {
							//ploxo = 0;
						}
						count_toch++;
                                                begynok;
					}
Но тогда опять моя 1 координата из текущей тройки есть 2 координата предыдущей


Проблема 2:
Вот я ввел коэффициенты ax+by+c = 0, затем идут всякие разные вычисления и когда идет проверка на то, чтобы мои точки текущего треугольника вдруг не совпали
Код:
if ((tochka[count_toch-1][0] != tochka[count_toch][0] && tochka[count_toch-1][1] != tochka[count_toch][1]) 
							|| (tochka[count_toch-1][0] != tochka[count_toch-2][0] && tochka[count_toch-1][1] != tochka[count_toch-2][1]) 
							|| (tochka[count_toch-2][0] != tochka[count_toch][0] && tochka[count_toch-2][1] != tochka[count_toch][1]))
То программа различает 0.0 и -0.0 и так далее. Как грамотно сравнивать их, чтобы такие случаи отсекались?
Я пробовал вводить константу типа float
Код:
eps = 0.0001
затем пытался делать так
Код:
if ((fabs(tochka[count_toch-1][0] - tochka[count_toch][0]) >esp && fabs(tochka[count_toch-1][1] - tochka[count_toch][1]) >esp)
       || (fabs(tochka[count_toch-1][0] - tochka[count_toch-2][0]) >esp && fabs(tochka[count_toch-1][1] - tochka[count_toch-2][1])>esp) 
       || (fabs(tochka[count_toch-2][0] - tochka[count_toch][0])>esp && fabs(tochka[count_toch-2][1] - tochka[count_toch][1]) >esp))
но все равно выводился бред

Возможно это из-за проблемы 1!
Большая просьба помочь

Если непонятен ход решение или алгоритм, постараюсь подробно объяснить

также в первом коде есть ошибка, правильно будет так:
Код:
if (ploxo == 0) {
		printf("\nnetu treugolnikov");

Последний раз редактировалось sidestep; 10.03.2012 в 14:55. Причина: ошибка
sidestep вне форума Ответить с цитированием
Старый 10.03.2012, 12:14   #4
sidestep
Пользователь
 
Регистрация: 14.09.2011
Сообщений: 93
По умолчанию

Просьба администрации, если есть такая возможность, переименовать тему в n линий на плоскости или треугольники, образованные пересечениями линий
sidestep вне форума Ответить с цитированием
Старый 10.03.2012, 16:25   #5
sidestep
Пользователь
 
Регистрация: 14.09.2011
Сообщений: 93
По умолчанию

Короче получилось вроде сделать
Вот рабочий код
Код:
#include <stdio.h>
#include <conio.h>
const int N=5;
const int P = (N*(N-1))/2;
float matrix[N][3];
float tochka[P][2];
int main() {  

	for (int i = 0; i < N; i++) {
		for (int j = 0; j < 3; j++) {
			scanf("%f", &matrix[i][j]); //вводим коэффициенты a,b и c уравнений вида  a*x +b*y+c=0
		}
	}
	int count_toch = 0;
	int count_treu = 0;
	int ploxo = 0;
	float x,y;
	for (int beg = 0; beg < N; beg++) {
		for (int i = beg + 1; i < N; i++) {
			// находим первую прямую с которой пересекается пробегающая
			if (matrix[i][1]*matrix[beg][0] != matrix[i][0]*matrix[beg][1]) {
				tochka[count_toch][0] = (matrix[beg][1]*matrix[i][2] - matrix[i][1]*matrix[beg][2])/(matrix[i][1]*matrix[beg][0] - matrix[i][0]*matrix[beg][1]); 
				tochka[count_toch][1] = (-matrix[beg][2]-matrix[beg][0]*tochka[count_toch][0])/matrix[beg][1];

				if (tochka[count_toch][0]==-0.0)
					tochka[count_toch][0]=0.0;
				if (tochka[count_toch][1]==-0.0)
			        tochka[count_toch][1]=0.0;

				x=tochka[count_toch][0];
				y=tochka[count_toch][1];

				//printf("\n%f   %f", tochka[count_toch][0], tochka[count_toch][1]);
				count_toch++;
				// находим прямую, с которой пересекаются и пробегающая и пересекающая пробегающую
				for (int j = i + 1; j < N; j++) {
					if (matrix[i][1]*matrix[beg][0] != matrix[i][0]*matrix[beg][1] && 
						matrix[j][1]*matrix[beg][0] != matrix[j][0]*matrix[beg][1] &&
						matrix[i][1]*matrix[j][0] != matrix[i][0]*matrix[j][1]
					) {
						// ищем точку пересечения первой с третьей прямой
						tochka[count_toch][0] = (matrix[beg][1]*matrix[j][2] - matrix[j][1]*matrix[beg][2])/(matrix[j][1]*matrix[beg][0] - matrix[j][0]*matrix[beg][1]);
						tochka[count_toch][1] = (-matrix[beg][2]-matrix[beg][0]*tochka[count_toch][0])/matrix[beg][1];
						
						if (tochka[count_toch][0]==-0.0)
							tochka[count_toch][0]=0.0;
						if (tochka[count_toch][1]==-0.0)
						    tochka[count_toch][1]=0.0;

						count_toch++;
						// ищем точку пересечения второй с третьей
						tochka[count_toch][0] = (matrix[i][1]*matrix[j][2] - matrix[j][1]*matrix[i][2])/(matrix[j][1]*matrix[i][0] - matrix[j][0]*matrix[i][1]);
						tochka[count_toch][1] = (-matrix[i][2]-matrix[i][0]*tochka[count_toch][0])/matrix[i][1];

						if (tochka[count_toch][0]==-0.0)
							tochka[count_toch][0]=0.0;
						if (tochka[count_toch][1]==-0.0)
							tochka[count_toch][1]=0.0;
						
						// проверка того, что точки нашего треугольника не совпадают
						if ((tochka[count_toch-1][0] != tochka[count_toch][0] && tochka[count_toch-1][1] != tochka[count_toch][1]) 
							|| (tochka[count_toch-1][0] != x && tochka[count_toch-1][1] != y) 
							|| (x != tochka[count_toch][0] && y != tochka[count_toch][1])) {
								count_treu++;
								ploxo = -1;
								// если все хорошо, то выводим их координаты
								printf("\n%i treugolnuik: (%f, %f), (%f, %f), (%f, %f)", count_treu, x, y,
									tochka[count_toch-1][0], tochka[count_toch-1][1],
									tochka[count_toch][0], tochka[count_toch][1]);

						} else {
							//ploxo = 0;
						}
						count_toch++;
					}
				}

			} 
		} 
	}
	// в противном случае выводим "нет треугольника"
	if (ploxo != -1) {
		printf("\nnetu treugolnikov");
	}

	getch();
	return 0;
}

Теперь проблема, которая меня вообще смущает

У моего друга все работает, ну по крайней мере на наших тестах точно
А у меня нет, 50 на 50 так сказать, половину правильно, а половину нет
В чем может быть проблема? я Так понял это уже со студией проблемы?

Использую VS 2010 C++
sidestep вне форума Ответить с цитированием
Старый 10.03.2012, 20:27   #6
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Однозначно - баг. А что именно за баг такой, сказать нельзя, пока не протестируешь полностью код.

А проще всего код тестировать, когда он - не одна большая простыня, а разбит на логически целостные куски.

В этом случае появляется возможность протестировать отдельные простые функции.

Чего тебе и рекомендую сделать: разбить простыню на функции, и протестировать каждую функцию в отдельности.
_Bers вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ошибка - Run-time error '91' Object variable or With block variable not set Артур Иваныч Microsoft Office Excel 13 12.09.2012 14:18
Бинарные файлы и Stack around the variable was corrupted Borsch Общие вопросы C/C++ 3 04.06.2011 16:54
Run-Time Check Failure #2 - Stack around the variable 'a' was corrupted. Gidross Общие вопросы C/C++ 9 28.12.2010 15:22
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