Форум программистов, компьютерный форум, киберфорум
Turbo Pascal
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
2 / 2 / 1
Регистрация: 14.08.2010
Сообщений: 41
1

Ошибка с переполнением стека

26.10.2011, 16:11. Показов 914. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Тут такое дело...в-общем, вот условие:
В исходном файле сначала идёт число n - общее количество треугольников. Далее в n строках идут х и у координаты каждой вершины каждого треугольника (т. е на одной строке находятся 3 х- и 3 у-координаты). Требуется написать программу, вычисляющую общую площадь всех этих треугольников (они могут наползать друг на друга).
Я решил вот как: напиасать отдельную функцию проверки owned, и потом в переменных real проверять, принадлежит ли точка хотя бы одному из треугольников. Координаты точки изменяются с неким шагом dx и dy. Проблема в том, что при запуске программы курсор становится на слово begin процедуры checkowned и выдаётся ошибка "Error 202. Stack overflaw error."
Pascal
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
program pr1;
uses crt;
const cst=1000;
      dx=0.1;
      dy=0.1;
type zap=record
     x1:integer;
     y1:integer;
     x2:integer;
     y2:integer;
     x3:integer;
     y3:integer;
     end;
 
     mass=array[1..cst] of zap;
 
var mas:mass;
    s:real;
    i,n,t:integer;
    f:text;
 
 
function ras(x1,y1,x2,y2:real): real;
begin;
ras:=sqrt(sqr(x1-x2)+sqr(y1-y2));
end;
 
function arcos(x,y,x1,y1,x2,y2:real):real;
var a:real;
begin;
a:=((sqr(ras(x,y,x1,y1))+sqr(ras(x,y,x2,y2))-sqr(ras(x1,y1,x2,y2))))/(2*sqr(ras(x,y,x1,y1))*sqr(ras(x,y,x2,y2)));
arcos:=arctan(sqrt(1-sqr(a))/a);
end;
 
function owned(x,y,x1,y1,x2,y2,x3,y3:real):boolean;
begin;
if arcos(x,y,x1,y1,x2,y2)+arcos(x,y,x2,y2,x3,y3)+arcos(x,y,x3,y3,x1,y1)=2*pi
        then owned:=true
        else owned:=false;
end;
 
procedure findkoord(xmin,ymin,xmax,ymax,n:integer; mas:mass);        {Searching for max and min koordinates}
var i:longint;
begin;
xmin:=mas[i].x1;
ymin:=mas[i].x1;
xmax:=mas[i].x1;
ymax:=mas[i].x1;
for i:=1 to n do begin;
                 if mas[i].x1>xmax then xmax:=mas[i].x1;
                 if mas[i].x1>xmax then xmax:=mas[i].x2;
                 if mas[i].x1>xmax then xmax:=mas[i].x3;
                 if mas[i].x1<xmin then xmin:=mas[i].x1;
                 if mas[i].x1<xmin then xmin:=mas[i].x2;
                 if mas[i].x1<xmin then xmin:=mas[i].x3;
                 if mas[i].y1>ymax then ymax:=mas[i].y1;
                 if mas[i].y1>ymax then ymax:=mas[i].y2;
                 if mas[i].y1>ymax then ymax:=mas[i].y3;
                 if mas[i].y1<ymin then ymin:=mas[i].y1;
                 if mas[i].y1<ymin then ymin:=mas[i].y2;
                 if mas[i].y1<ymin then ymin:=mas[i].y3;
                 end;
end;
 
procedure checkowned(mas:mass; n,t:integer; s:real );      {Finding the area of the square}
var i,k:longint;
    xmin,ymin,xmax,ymax:integer;
    x,y:real;
begin;
t:=0;
findkoord(xmin,ymin,xmax,ymax,n,mas);
x:=xmin;
y:=ymin;
repeat;
    x:=x+dx;
    repeat
          y:=y+dy;
          for i:=1 to n do if owned(x,y,mas[i].x1,mas[i].y1,mas[i].x2,mas[i].y2,mas[i].x3,mas[i].y3) then
              begin;
              inc(t);
              continue;
              end;
          inc(k);
    until y=ymax;
until x=xmax;
s:=t*abs(xmax-xmin)*abs(ymax-ymin)/k;
end;
 
{**********************************************************************************}
 
BEGIN;
assign(f,'input.txt');
reset(f);
readln(f,n);
for i:=1 to n do readln(f,mas[i].x1,mas[i].y1,mas[i].x2,mas[i].y2,mas[i].x3,mas[i].y3);
checkowned(mas,n,t,s);
writeln(s:7:3);
readln;
close(f);
assign(f,'output.txt');
rewrite(f);
write(f,s);
END.
кто-нибудь может подсказать причину такой ошибки и способ её устранения?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.10.2011, 16:11
Ответы с готовыми решениями:

Как бороться с переполнением стека
Доброго времени суток! Помогите, пожалуйста, с программой! В паскале происходит переполнение...

Переполнением стека при вычислении функции с через рекурсию!
Нужно написать программу для вычисления с помощью рекурсии: 1/a+1/a*(a+1)+...+1/a*(a+1)*...*(a+n)!...

Редкая ошибка, связанная с переполнением стека
Значит ситуация такая, вот весь код он полностью рабочий, но для перегрузки потокового ввода...

Как бороться с переполнением стека
Мне нужно понять как бороться с переполнением стека. Есть управляющая процедура. изначально она...

6
Почетный модератор
64300 / 47595 / 32743
Регистрация: 18.05.2008
Сообщений: 115,181
26.10.2011, 18:53 2
202 Stack overflow error (Переполнение стека).
Эта ошибка генерируется на входе в процедуру или функцию, скомпилированную в режиме {$S+}, в случае, если нет достаточной области для размещения локальных переменных подпрограммы. Увеличьте размер стека, используя директиву компилятора {$М}.
Ошибка еще здесь
Pascal
1
2
3
4
5
6
7
procedure findkoord(xmin,ymin,xmax,ymax,n:integer; mas:mass);        {Searching for max and min koordinates}
var i:longint;
begin;
xmin:=mas[i].x1;
ymin:=mas[i].x1;
xmax:=mas[i].x1;
ymax:=mas[i].x1;
нужно mas[1];

Добавлено через 1 минуту
Уменьшил cst до 100, переполнения не стало, но программа зависла, так и не дождался конца.
По-моему нужно максимально возможно уменьшить число переменных.

Добавлено через 45 секунд
По крайней мере при тестировании программы взять минимально возможное число треугольников.
0
2 / 2 / 1
Регистрация: 14.08.2010
Сообщений: 41
26.10.2011, 21:01  [ТС] 3
Насчёт присваивания xmax и xmin - это просто я описался. Бывает. Насчёт переменных - не знаю, вроде бы все лишние я поудалял...
Что до треугольников - я и так брал 3 штуки...
0
Почетный модератор
64300 / 47595 / 32743
Регистрация: 18.05.2008
Сообщений: 115,181
26.10.2011, 21:17 4
Цитата Сообщение от Октавиан_Август Посмотреть сообщение
Что до треугольников - я и так брал 3 штуки..
Но под переменную-массив выделено для 1000 треугольников, да еще куча всего.
0
2 / 2 / 1
Регистрация: 14.08.2010
Сообщений: 41
27.10.2011, 20:20  [ТС] 5
Кое-что начал проясняться. После уменьшения значения const стало выскакивать сообщения Error 207. Invalid floating point operation. Курсор при этом никуда не становится. Судя по всему, он обижается на фнукцию arcos...может есть нормальный способ найти косинус, а не мой индусский?
0
Почетный модератор
64300 / 47595 / 32743
Регистрация: 18.05.2008
Сообщений: 115,181
27.10.2011, 20:28 6
Да нет другого способа, просто нужно дополнить случаями когда косинус=0,1,-1.
0
2 / 2 / 1
Регистрация: 14.08.2010
Сообщений: 41
27.10.2011, 20:38  [ТС] 7
Цитата Сообщение от Puporev Посмотреть сообщение
Да нет другого способа, просто нужно дополнить случаями когда косинус=0,1,-1
А вот этого не заметил. И правда, знаменатель-то в 0 обратиться можетно всё равно именно в ней всё дело. Нашёл в ней несущественную ошибку, выкинул лишние скобки - 0 эмоций...
0
27.10.2011, 20:38
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.10.2011, 20:38
Помогаю со студенческими работами здесь

Проблема с переполнением стека при табуляции функции
Здравствуйте. В самой программе реализуется табуляция функции (рис 1) и ряда (рис 2), ряд, в свою...

Реализация бинарного древа с помощью рекурсии чревата переполнением стека?
В реализации бинарного древа с помощью рекурсии (использования рекурсии в процессе написании...

Ошибка, связанная с переполнением буфера
В общем, данный код рабочий, собираю на VS2013, при компиляции выдает переполнение буфера. Другие...

Ошибка Томката связанная с переполнением..
Странные вещи творяться... это все на локальной машине c JDK 1.4.0 и Tomcat 4.1.12 есть у меня...


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

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