|
1296 / 469 / 151 Регистрация: 24.08.2011 Сообщений: 2,249 |
|
|
1 |
|
|
21.03.2015, 18:48. Показов 5803. Ответов 23
Задание: Я для каждого размера заполняю массив по возрастанию, по убыванию и случайным образом, и замеряю количество пересылок и сравнений для каждого случая. Пока что только метод Прямого выбора проверяю.
0 |
|
Модератор
8276 / 4180 / 1595 Регистрация: 01.02.2015 Сообщений: 12,994 Записей в блоге: 3 |
|
|
21.03.2015, 19:45 |
2 |
|
Решение У меня не сразу воспроизвелась ошибка. И я решил, что это связано с режимами компиляции. Вывод: для суммирования использовать более ёмкий тип.
1 |
|
1296 / 469 / 151 Регистрация: 24.08.2011 Сообщений: 2,249 |
|
|
21.03.2015, 19:49 [ТС] |
3 |
|
ФедосеевПавел, тогда почему у меня вылетает в сортировке, а не в счете? и не может именно взять a[0] почему-то, хотя a[0] явно существует и уже использовался
0 |
|
1296 / 469 / 151 Регистрация: 24.08.2011 Сообщений: 2,249 |
|
|
21.03.2015, 19:59 [ТС] |
4 |
|
Поменяла на int64 там. Вроде бы больше нигде увеличивать настолько не надо. Теперь вылетает на первой сортировке при n = 300.
0 |
|
1296 / 469 / 151 Регистрация: 24.08.2011 Сообщений: 2,249 |
|
|
21.03.2015, 20:00 [ТС] |
5 |
|
Ушла часа на полтора, если что
0 |
|
Супер-модератор
32444 / 20939 / 8104 Регистрация: 22.10.2011 Сообщений: 36,203 Записей в блоге: 7 |
|
|
21.03.2015, 20:09 |
6 |
|
РешениеКерра, гонял во всех режимах совместимости, вылета при mode delphi и при mode objfpc нет совсем, при mode tp / mode fpc вылетает с 201-ой ошибкой в count_sum, при mode macpas вылет там же, в count_sum, но уже с 217-ой ошибкой. Так что во-первых, озвучь режим, в котором работаешь, а во-вторых — исправить тип sum на более емкий таки придется. P.S. Со внесенными исправлениями по 30 запусков программы (в каждом режиме) прошло без сбоя.
1 |
|
Модератор
8276 / 4180 / 1595 Регистрация: 01.02.2015 Сообщений: 12,994 Записей в блоге: 3 |
|
|
21.03.2015, 20:13 |
7 |
|
После замены типа old_sum, count_sum и sum на int64, прогнал по всем режимам ObjFPC, Delphi и пр. Ошибка не возникала.
0 |
|
1296 / 469 / 151 Регистрация: 24.08.2011 Сообщений: 2,249 |
|
|
21.03.2015, 20:17 [ТС] |
8 |
|
ФедосеевПавел, тоже только что сделала ту же замену — все еще вылетает при первой сортировке с n = 300
0 |
|
Супер-модератор
32444 / 20939 / 8104 Регистрация: 22.10.2011 Сообщений: 36,203 Записей в блоге: 7 |
|
|
21.03.2015, 20:19 |
9 |
|
Керра, не то. Интересно, что выбрано в Options->Compiler->Compiler mode
0 |
|
1296 / 469 / 151 Регистрация: 24.08.2011 Сообщений: 2,249 |
|
|
21.03.2015, 20:20 [ТС] |
10 |
|
volvo, free pascal dialect
0 |
|
Модератор
8276 / 4180 / 1595 Регистрация: 01.02.2015 Сообщений: 12,994 Записей в блоге: 3 |
|
|
21.03.2015, 20:33 |
11 |
|
Sorry за шаманство. А если в каталоге с исходниками удалить все лишние файлы, а потом заново перекомпилировать?
0 |
|
1296 / 469 / 151 Регистрация: 24.08.2011 Сообщений: 2,249 |
|
|
21.03.2015, 21:34 [ТС] |
12 |
|
Ничего не изменилось Добавлено через 56 минут Добавлено через 1 минуту
0 |
|
Модератор
8276 / 4180 / 1595 Регистрация: 01.02.2015 Сообщений: 12,994 Записей в блоге: 3 |
|
|
21.03.2015, 21:35 |
13 |
|
(робко) Ура?
1 |
|
1296 / 469 / 151 Регистрация: 24.08.2011 Сообщений: 2,249 |
|
|
21.03.2015, 21:37 [ТС] |
14 |
|
.
0 |
|
bormant Модератор
7480 / 4352 / 2771 Регистрация: 22.11.2013 Сообщений: 12,478 Записей в блоге: 1 |
||||||||||||
|
22.03.2015, 00:16 |
15 |
|||||||||||
|
РешениеКерра,
Тогда код сортировок сохранится незагроможденным (обратите внимание на downto):
3) В таком варианте и код сбора статистики можно легко унифицировать:
2 |
|
1296 / 469 / 151 Регистрация: 24.08.2011 Сообщений: 2,249 |
|
|
22.03.2015, 07:50 [ТС] |
16 |
|
bormant, спасибо
0 |
|
bormant Модератор
7480 / 4352 / 2771 Регистрация: 22.11.2013 Сообщений: 12,478 Записей в блоге: 1 |
||||
|
22.03.2015, 09:20 |
17 |
|||
|
Если для сравнения алгоритмов захочется получить одни и те же псевдослучайный массивы, это несложно, достаточно обеспечить одинаковое начальное значение ГПСЧ:
Добавлено через 2 минуты
1 |
|
1296 / 469 / 151 Регистрация: 24.08.2011 Сообщений: 2,249 |
|
|
22.03.2015, 09:21 [ТС] |
18 |
|
Естественно
0 |
|
bormant Модератор
7480 / 4352 / 2771 Регистрация: 22.11.2013 Сообщений: 12,478 Записей в блоге: 1 |
||||||||
|
22.03.2015, 10:00 |
19 |
|||||||
|
По поводу суммы элементов. Поскольку используется она как контрольная сумма без учета порядка, программист вправе принять решение о допустимости переполнений при ее подсчете. В FPC за целочисленный переполнения отвечает $R, в TP — $Q, обе локальные (в Delphi на уровне процедуры, в TP/FPC на уровне выражения). В FPC Inc/Dec контролируются на переполнение, в TP — нет. Поэтому возможен такой вариант для подавления ошибки переполнения при подсчете контрольной суммы:
пляска с условной компиляцией для восстановления лолкальных опций компиляции на последующий код. Добавлено через 8 минут
1 |
|
Супер-модератор
32444 / 20939 / 8104 Регистрация: 22.10.2011 Сообщений: 36,203 Записей в блоге: 7 |
|
|
22.03.2015, 11:41 |
20 |
|
{$OFFTOP ON}
0 |
I have tried to make a simple snake game with Free Pascal, when I started the programme, it drew the map exactly what I want but after that, I pressed the button that I have set to control the snake and it exited with exit code 201.
I don’t know much about that exit code, could you explain me the problems of the programme? This is the longest program I have ever made with Pascal.
Here is the code:
uses crt;
type
ran=record
x:byte;
y:byte;
end;
var
f:ran;
s:array[1..1000] of ran;
i,j:longint;
st,l:byte;
function getkey:integer;
var
k:integer;
begin
k:=ord(readkey);
if k=0 then k:=-ord(readkey);
getkey:=k;
end;
procedure fa;
begin
randomize;
f.x:=random(98)+1;
f.y:=random(23)+1;
gotoxy(f.x,f.y);
writeln('o');
end;
procedure draw;
begin
gotoxy(1,1);
st:=1;
for i:=1 to 25 do begin
for j:=1 to 100 do write('X');
writeln
end;
gotoxy(st+1,st+1);
for i:=1 to 23 do begin
for j:=1 to 98 do write(' ');
gotoxy(st+1,i+2);
end;
end;
procedure sts;
begin
s[1].x:=19;
s[1].y:=6;
gotoxy(s[1].x,s[1].y);
writeln('@');
end;
procedure fa1;
begin
f.x:=29;
f.y:=5;
gotoxy(f.x,f.y);
writeln('o');
end;
procedure eat;
begin
if (s[1].x=f.x) and (s[1].y=f.y) then begin
l:=l+1;
fa;
end;
end;
function die:boolean;
begin
die:=false;
if (s[1].x=1) or (s[1].x=100) or (s[1].y=1) or (s[1].y=25) then
die:=true;
if l>=5 then
for i:=5 to l do
if (s[1].x=s[i].x) and (s[1].y=s[i].y) then
die:=true;
end;
procedure up;
begin
for i:=l downto 2 do begin
s[i].y:=s[i-1].y;
gotoxy(s[i].x,s[i].y);
writeln('+');
end;
gotoxy(s[l].x,s[l].y+1);
writeln(' ');
s[1].y:=s[1].y-1;
gotoxy(s[1].x,s[1].y);
writeln('@');
end;
procedure down;
begin
for i:=l downto 2 do begin
s[i].y:=s[i-1].y;
gotoxy(s[i].x,s[i].y);
writeln('+');
end;
gotoxy(s[l].x,s[l].y-1);
writeln(' ');
s[1].y:=s[1].y+1;
gotoxy(s[1].x,s[1].y);
writeln('@');
end;
procedure left;
begin
for i:=l downto 2 do begin
s[i].x:=s[i-1].x;
gotoxy(s[i].x,s[i].y);
writeln('+');
end;
gotoxy(s[l].x+1,s[l].y);
writeln(' ');
s[1].x:=s[1].x-1;
gotoxy(s[1].x,s[1].y);
writeln('@');
end;
procedure right;
begin
for i:=l downto 2 do begin
s[i].x:=s[i-1].x;
gotoxy(s[i].x,s[i].y);
writeln('+');
end;
gotoxy(s[l].x-1,s[l].y);
writeln(' ');
s[1].x:=s[1].x+1;
gotoxy(s[1].x,s[1].y);
writeln('@');
end;
procedure auto(k:integer);
begin
case k of
-72:up;
-80:down;
-75:left;
-77:right;
119:up;
115:down;
97:left;
100:right;
end;
end;
procedure ingame(t:integer);
var
d,e:boolean;
begin
repeat
auto(t);
d:=die;
if d=true then exit;
eat;
until (keypressed);
if keypressed then t:=getkey;
case t of
-72:up;
-80:down;
-75:left;
-77:right;
119:up;
115:down;
97:left;
100:right;
end;
eat;
d:=die;
if d=true then exit;
end;
procedure first;
var
k:integer;
begin
draw;
fa1;
sts;
if keypressed then k:=getkey;
ingame(k);
end;
BEGIN
clrscr;
first;
readln
END.
Maxizar писал(а):1- Используйте Lazarus.
Если уметь патчить паскалевское иде, то для многих целей оно не хуже.
2- Забудьте про атавизмы (Goto, Uses Graph, Crt). Не ну правда это даже смешно:
Лучше несколько Goto чем один указатель — структуру программы не разрушает, багов сверх меры не создаёт. Инициализация Crt весит намного меньше Sysutils, а для хелловорда от них требуется лишь Delay или Sleep. Sysutils лишь не устраивает некритичного бага при Writeln(‘русский текст в Utf8 кодировке’); Другие преимущества нужно искать с микроскопом. Sdl работает намного стабильнее Graph и в линуксе и в виндовсе, но не имеет процедур типа Line, Cirkle — того что нужно для построения графиков.
4- Я переписал программу, и она полностью работает, так в чем проблема?
Ага, работает, скомпиленная лично вами, под вайном. Лазарус 0.9.28.2 beta под линуксом не желает её компилить — отсутствует модуль Graph. Имхо, только по этой причине прогамму ещё не разложили по полочкам.
из-за чего приходится проходить весь код… у вас код 100 строк.. и пару циклов….. Дебаггер в руки и вперед.
Какой тут ещё дебаггер? При условии компиляции и запуска, здесь и без него просто ищется. Воткнуть
- Код: Выделить всё
A:=A div(A-A);
скомпилировать, запустить, посмотреть вывод, перенести вставку в другое место, скомпилить… И так до обнаружения проблемного оператора.
А автору программы можно посоветовать пореже использовать integer если нет уверенности насчёт ошибки переполнения — int64 наше всё.
Добавлено спустя 1 час 13 минут 11 секунд:
Да, вспомнил, при низкоуровневом рисовании нужно проверять координаты рисуемых точек на диапазон. Если рисовать за пределами окна, то может случиться страшное — что-то типа ошибки 201.

|
|
|
Сообщение |
|
|
Группа: Пользователи
Репутация: |
Здравствуйте, уважаемые программисты, администраторы, пользователи и т.д. Спойлер (Показать/Скрыть) Сообщение отредактировано: SaheR — 27.08.2013 0:35 |
|
|
|
| Ромаха |
Сообщение |
|
Новичок
Группа: Пользователи
Репутация: |
Добрый день. То есть выход за пределы. Удачи! |
|
|
|
| SaheR |
Сообщение |
|
Группа: Пользователи
Репутация: |
Цитата(Ромаха @ 28.08.2013 11:47) Добрый день. То есть выход за пределы. Удачи! Спасибо за напоминание, но я написал сюда уже от беспомощности т.к. и не нашёл, где происходит выход за пределы массива. gotoxy(7, i*2); в этом файле должно быть не более 12 строк. На данный момент, у меня в этом файле находится всего четыре строчки, в каждой по одному слову(если нужно, уточню — в английской раскладке). |
|
|
|
| SaheR |
Сообщение |
|
Группа: Пользователи
Репутация: |
Всё, ошибку свою нашёл. Вместо readln, при чтении с файла, использовал read. |
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
Связь с администрацией: bu_gen в домене octagram.name
Написал прогу на сумму чисел в столбик(используя модуль). В ABC работает отлично, претензий нет. Но в Free дает ошибку 201(помоему ссылка на несущ. переменную). Если записать все в одну прогу(без модуля), то проблем нету. В принципе такого разногласия не должно быть. Что делать, помогите?!
Модуль:
unit sum;
interface
uses crt;
procedure chasti(a:longint; var e,d,s,t,dt,st,n: longint);
procedure summa(x,y: integer);
implementation
procedure chasti(a:longint; var e,d,s,t,dt,st,n: longint);
begin
e:=a mod 10;
n:=n+1;
if a>=10 then begin
d:=trunc((a-e)/10) mod 10;
n:=n+1; end;
if a>=100 then begin
s:=trunc((a-10*d-e)/100) mod 10;
n:=n+1; end;
if a>=1000 then begin
t:=trunc((a-100*s-10*d-e)/1000) mod 10;
n:=n+1; end;
if a>=10000 then begin
dt:=trunc((a-1000*t-100*s-10*d-e)/10000) mod 10;
n:=n+1; end;
if a>=100000 then begin
st:=trunc((a-10000*dt-1000*t-100*s-10*d-e)/100000) mod 10;
n:=n+1; end;
end;
procedure summa(x,y: integer);
var z: longint;
i,b,n,e1,d1,s1,t1,dt1,st1,n1: longint;
BeGIN
clrscr;
n:=0;
z:=x+y;
chasti(z,e1,d1,s1,t1,dt1,st1,n1);
for i:=1 to n1 do
begin
b:=b+7;
gotoxy(1,b);
writeln(x);
writeln('+');
writeln(y);
writeln('------');
if i=1 then begin
gotoxy(n1,b+4);
writeln(e1); end;
if i=2 then begin
gotoxy(n1-1,b+4);
writeln(d1,e1); end;
if i=3 then begin
gotoxy(n1-2,b+4);
writeln(s1,d1,e1); end;
if i=4 then begin
gotoxy(n1-3,b+4);
writeln(t1,s1,d1,e1); end;
if i=5 then begin
gotoxy(n1-4,b+4);
writeln(dt1,t1,s1,d1,e1); end;
if i=6 then begin
gotoxy(n1-5,b+4);
writeln(st1,dt1,t1,s1,d1,e1); end;
readln;
end;
END;
end.
uses crt,sum;
var x1,y1: integer;
BEGIN
clrscr;
write('Vvedite pervoye chislo: ');
readln(x1);
write('Vvedite vtoroye chislo: ');
readln(y1);
summa(x1,y1);
repeat until keypressed;
END.
201 : range error
215 : overflow checking when doing computation with integer
202 : overflow stack
106 : invalid numeric format
1 : invalid function number
2 : file not found
3 : path not found
4 : too many open files
5 : file access denied
6 : invalid file handle
12 : invalid file access code
15 : invalid drive number
16 : cannot remove current directory
17 : cannot rename across
18 : no more files
100 : disk read error
101 : disk write error
102 : file not assigned
103 : file not open
104 : file not open for input
105 : file not open for output
150 : disk is write protected
151 : bad drive request structure length
152 : drive not ready
154 : CRC error in data
156 : disk seek error
157 : unknown media type
158 : sector not found
159 : printer out of paper
160 : device write fault
161 : device read fault
162 : hardware failure
200 : div by zero
203 : heap overflow
204 : invalid pointer operation
205 : floating point overflow
206 : floating point underflow
207 : invalid floating point operation
208 : overlay manager not installed
209 : overlay file read error
210 : object not initialized
211 : call to abstract method
212 : stream registration error
213 : collection index out of range
214 : collection overflow error
216 : general protection fault
217 : invalid operation code
227 : assertion failed
300 : file IO error
301 : non-matched array bounds
302 : non-local procedure pointer
303 : procedure pointer out of scope
304 : function not implemented
305 : breakpoint error
306 : break by ctrl/c
307 : break by ctrl/break
308 : break by other process
309 : no floating point coprocessor
310 : invalid variant type operation
Сообщение было отмечено MayaNash как решение



27.08.2013 0:32
0 






