1296 / 469 / 151 Регистрация: 24.08.2011 Сообщений: 2,249 |
|
1 |
|
21.03.2015, 18:48. Показов 5889. Ответов 23
Задание: Я для каждого размера заполняю массив по возрастанию, по убыванию и случайным образом, и замеряю количество пересылок и сравнений для каждого случая. Пока что только метод Прямого выбора проверяю.
0 |
Модератор 8279 / 4183 / 1595 Регистрация: 01.02.2015 Сообщений: 13,004 Записей в блоге: 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 |
Супер-модератор 32451 / 20945 / 8105 Регистрация: 22.10.2011 Сообщений: 36,213 Записей в блоге: 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 |
Модератор 8279 / 4183 / 1595 Регистрация: 01.02.2015 Сообщений: 13,004 Записей в блоге: 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 |
Супер-модератор 32451 / 20945 / 8105 Регистрация: 22.10.2011 Сообщений: 36,213 Записей в блоге: 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 |
Модератор 8279 / 4183 / 1595 Регистрация: 01.02.2015 Сообщений: 13,004 Записей в блоге: 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 |
Модератор 8279 / 4183 / 1595 Регистрация: 01.02.2015 Сообщений: 13,004 Записей в блоге: 3 |
|
21.03.2015, 21:35 |
13 |
(робко) Ура?
1 |
1296 / 469 / 151 Регистрация: 24.08.2011 Сообщений: 2,249 |
|
21.03.2015, 21:37 [ТС] |
14 |
.
0 |
bormant Модератор 7502 / 4370 / 2776 Регистрация: 22.11.2013 Сообщений: 12,507 Записей в блоге: 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 Модератор 7502 / 4370 / 2776 Регистрация: 22.11.2013 Сообщений: 12,507 Записей в блоге: 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 Модератор 7502 / 4370 / 2776 Регистрация: 22.11.2013 Сообщений: 12,507 Записей в блоге: 1 |
||||||||
22.03.2015, 10:00 |
19 |
|||||||
По поводу суммы элементов. Поскольку используется она как контрольная сумма без учета порядка, программист вправе принять решение о допустимости переполнений при ее подсчете. В FPC за целочисленный переполнения отвечает $R, в TP — $Q, обе локальные (в Delphi на уровне процедуры, в TP/FPC на уровне выражения). В FPC Inc/Dec контролируются на переполнение, в TP — нет. Поэтому возможен такой вариант для подавления ошибки переполнения при подсчете контрольной суммы:
пляска с условной компиляцией для восстановления лолкальных опций компиляции на последующий код. Добавлено через 8 минут
1 |
Супер-модератор 32451 / 20945 / 8105 Регистрация: 22.10.2011 Сообщений: 36,213 Записей в блоге: 7 |
|
22.03.2015, 11:41 |
20 |
{$OFFTOP ON}
0 |
Модератор: Модераторы
ошибка 201 при работе с дин. масивом
доброго времени суток
есть такая проблема при работе с динамическим масивом spectr
задаю длину масива [0..2*10e6, 0..1] — ок (долго соображает)
записую данные в масив — на 100000-200000 ок
выхожу из цикла — ок
потом программа долго соображает и вылетает с кодом 201
0 0.000 mV 60216
0 0.000 mV 60217
End read Data to Buffer, go write to File
Runtime error 201 at $00002ACD
$00002ACD
$00005E9A
$00002094
при длине до 20000 все работает
FreePascal IDE for GO32 V2 DOS extender
Target CPU: i386
Version 1.0.10 2009/04/01
(Compiler Version 2.2.4)
(Debugger GDB 6.1.1)
OS: Win98
- Код: Выделить всё
var data : array[1..5] of integer;
digit : array[1..4] of real;
spectr: array of array of real;
i, vel : integer;
velk, cnt : longint;
value, xmax, xmin, xexit : real;
fout : text;
port : tport;begin
...
xexit:=1900*(xmax-xmin)*velk;
SetLength(spectr, round(xexit), 2);assign(fout,fname);
rewrite(fout);cnt:=0;
while (not keypressed) and (cnt<xexit) do {nachalo izmereniya}
begin
...
spectr[cnt,0]:=1; spectr[cnt,1]:=value;
...
inc(cnt);
end;writeln('End read Data to Buffer, go write to File');
{ Error }
for i:=0 to cnt-1 do
begin
writeln(fout, spectr[i,0]:0:0, ' ', spectr[i,1]:5:5);
writeln(i);
flush(fout);
end;
close(fout);
- anjeyka
- незнакомец
- Сообщения: 6
- Зарегистрирован: 02.10.2009 12:36:44
- Откуда: Киев, Украина
-
- Профиль
- Сайт
- ICQ
Re: ошибка 201 при работе с дин. масивом
Mr.Smart » 02.10.2009 14:19:26
anjeyka
Не очень понятно как вы инициализируете динамический массив.
У вас есть массив следующего вида:
- Код: Выделить всё
spectr: array of array of real;
это значит, что у вашего массива каждый элемент является тоже динамическим массивом, но судя по представленному коду вы производите инициализацию только основной массив (если конечно случайно вы не вырезали код), а обращаетесь к ячейкам не инициализированных подмассивов.
Инициализация вашего массива будет примерно следующая:
- Код: Выделить всё
SetLength(spectr,...);
for j:=0 to ... do
SetLength(spectr[j],...);
- Mr.Smart
- долгожитель
- Сообщения: 1796
- Зарегистрирован: 29.03.2008 01:01:11
- Откуда: из леса!
Re: ошибка 201 при работе с дин. масивом
anjeyka » 02.10.2009 14:31:46
- Код: Выделить всё
spectr: array of array of real;
— двух-мерный масив
и размер задаеться стандартно:
- Код: Выделить всё
SetLength(spectr, x, y);
в моем случае x — round(xexit), y — 2
- anjeyka
- незнакомец
- Сообщения: 6
- Зарегистрирован: 02.10.2009 12:36:44
- Откуда: Киев, Украина
-
- Профиль
- Сайт
- ICQ
Re: ошибка 201 при работе с дин. масивом
Mr.Smart » 02.10.2009 15:07:33
Фига се А я всегда думал, что только один параметр
- Mr.Smart
- долгожитель
- Сообщения: 1796
- Зарегистрирован: 29.03.2008 01:01:11
- Откуда: из леса!
Re: ошибка 201 при работе с дин. масивом
Sergei I. Gorelkin » 02.10.2009 15:23:22
Объяви отсчет как статический массив из двух элементов:
sample = array[0..1] of real;
А потом одномерный динамический массив из них:
var spectr: array of sample;
Потом еще придется скобки по-другому расставить, вместо spectr[cnt,0] будет spectr[cnt][0].
Но при этом, во-первых, вместо 2*1e6 выделений памяти будет ровно одно, во-вторых, самой памяти потребуется как минимум вдвое меньше, в-третьих, вся математика с этими данными будет шустрее, т.к. данные лежат подряд, а не размазаны тонким слоем по всему адресному пространству.
Если и так не заработает, то это уже претензии к DPMI. Цифра 20000, вообще, наводит на мысли, что там где-то присутствует ограничение 65536 байт на сегмент…
-
Sergei I. Gorelkin - энтузиаст
- Сообщения: 1390
- Зарегистрирован: 24.07.2005 14:40:41
- Откуда: Зеленоград
-
- Профиль
- ICQ
Re: ошибка 201 при работе с дин. масивом
Mr.Smart » 02.10.2009 15:35:13
anjeyka
В общем попробовал по разному объявлять данный массив. Если использовать динамический массив ошибка происходит при чистки памяти.
А вот в случае объявления статического массива размером 200000 элементов ни какой ошибки не возникает….
- Код: Выделить всё
arr: array[0..200000] of array [0..1] of Real;
Добавлено спустя 48 секунд:
Sergei I. Gorelkin писал(а):Если и так не заработает, то это уже претензии к DPMI. Цифра 20000, вообще, наводит на мысли, что там где-то присутствует ограничение 65536 байт на сегмент…
Ошибка вылетает и в Win32
- Mr.Smart
- долгожитель
- Сообщения: 1796
- Зарегистрирован: 29.03.2008 01:01:11
- Откуда: из леса!
Re: ошибка 201 при работе с дин. масивом
Vadim » 02.10.2009 18:23:54
Вот, написал для проверки такую программку:
- Код: Выделить всё
Var
spectr: array of array of single;
i, j: integer;Begin
Randomize;
SetLength(spectr, 2 000 000, 2);
For i:=0 to 1 999 999 Do
For j:=0 to 1 Do
spectr[i,j]:=Random;
For i:=0 to 1 999 999 Do
For j:=0 to 1 Do
If (i=500 000) or (i=1 000 000) or (i=1 500 000) or (i=1 999 999) Then
WriteLn(i, ' ', j, ' ', spectr[i,j]:6:3);
WriteLn('Это конец...');
End.
Вот её вывод:
- Код: Выделить всё
500000 0 0.247
500000 1 0.174
1000000 0 0.849
1000000 1 0.137
1500000 0 0.299
1500000 1 0.243
1999999 0 0.041
1999999 1 0.154
Это конец...
Или я чего-то не понял, или проблема в другом месте.
Компилятор 2.2.5.
Последний раз редактировалось Vadim 02.10.2009 19:03:44, всего редактировалось 1 раз.
- Vadim
- долгожитель
- Сообщения: 4112
- Зарегистрирован: 05.10.2006 08:52:59
- Откуда: Красноярск
Re: ошибка 201 при работе с дин. масивом
Sergei I. Gorelkin » 02.10.2009 18:33:46
У меня примерно такая же программа тоже отработала без вопросов, и на Windows XP, и на Windows 98, FPC 2.5.1.
Так что происходящее становится больше похожим на затирание памяти в каком-то другом месте…
-
Sergei I. Gorelkin - энтузиаст
- Сообщения: 1390
- Зарегистрирован: 24.07.2005 14:40:41
- Откуда: Зеленоград
-
- Профиль
- ICQ
Re: ошибка 201 при работе с дин. масивом
anjeyka » 06.10.2009 12:47:20
програмка работает и у меня,
правда пришлось заменить тип «integer» на «LongInt»
- Код: Выделить всё
_ Free Pascal IDE Version 1.0.10 [2009/04/01]
_ Compiler Version 2.2.4
_ GDB Version GDB 6.1.1
_ Using configuration files from: C:PPBINGO32V2
Running "c:ppbingo32v2test_mem.exe "
500000 0 0.434
500000 1 0.618
1000000 0 0.036
1000000 1 0.762
1500000 0 0.982
1500000 1 0.602
1999999 0 0.020
1999999 1 0.041
Это конец...
есть идея — проверяю:
у меня i : integer, a cnt : longint
а перед ошибкой идет for i:=0 to cnt — integer не вмещает 2 000 000 (в моем случае)
сделал все — longint
Table 3.2: Predefined integer types
Type Range
Smallint -32768 .. 32767
Integer either smallint or longint
Longint -2147483648 .. 2147483647
Последний раз редактировалось anjeyka 06.10.2009 14:07:02, всего редактировалось 3 раз(а).
- anjeyka
- незнакомец
- Сообщения: 6
- Зарегистрирован: 02.10.2009 12:36:44
- Откуда: Киев, Украина
-
- Профиль
- Сайт
- ICQ
Re: ошибка 201 при работе с дин. масивом
Vadim » 06.10.2009 13:02:43
anjeyka
Тогда давайте попробуем сделать вот что. Вместо этого фрагмента:
- Код: Выделить всё
for i:=0 to cnt-1 do
begin
writeln(fout, spectr[i,0]:0:0, ' ', spectr[i,1]:5:5);
writeln(i);
flush(fout);
end;
Поставьте такой:
- Код: Выделить всё
for i:=0 to High(spectr) do
begin
writeln(fout, spectr[i,0]:0:0, ' ', spectr[i,1]:5:5);
writeln(i);
flush(fout);
end;
Функция High() гарантированно возмёт наибольший существующий индекс массива. Для данного применения это будет та цифра, которую Вы задаёте первой цифрой в процедуре SetLength() минус 1.
Добавлено спустя 3 минуты 16 секунд:
anjeyka писал(а):integer не вмещает 2 000 000
А вот и неправда. Тип Integer для 32-ух разрядного компилятора работает с диапазоном чисел от -2 147 483 648 до 2 147 483 647.
Последний раз редактировалось Vadim 06.10.2009 13:10:56, всего редактировалось 1 раз.
- Vadim
- долгожитель
- Сообщения: 4112
- Зарегистрирован: 05.10.2006 08:52:59
- Откуда: Красноярск
Re: ошибка 201 при работе с дин. масивом
anjeyka » 06.10.2009 13:10:48
¦+——————————- test_mem2.pas ————————-4——+
¦¦program testmem2;
¦¦var i: integer;
¦¦begin
¦¦ for i:=0 to 2000000 do
¦¦end.+-[_]———- Compiling (Debug mode) —————
¦ Main file: c:ppbingo32v2test_mem2.pas
¦ Failed to compile…
¦ Target: GO32 V2 DOS extender
¦ Line number: 0 Total lines: 4
¦ Used memory: 298K Allocated memory: 3776K
¦ Total errors: 3 Compile time: 0.5s
¦ Compile failed
¦
+-[_]————————- Compiler Messages ————————5-[]-+
¦ test_mem2.pas(4,14) Error: range check error while evaluating constants
¦ test_mem2.pas(5,4) Fatal: There were 1 errors compiling module, stopping _
¦ test_mem2.pas(0) Fatal: Compilation aborted _
может я что с компилятором натворил
- anjeyka
- незнакомец
- Сообщения: 6
- Зарегистрирован: 02.10.2009 12:36:44
- Откуда: Киев, Украина
-
- Профиль
- Сайт
- ICQ
Re: ошибка 201 при работе с дин. масивом
Vadim » 06.10.2009 13:14:04
anjeyka
Поставьте самой первой строкой программы:
{$mode objfpc}
- Vadim
- долгожитель
- Сообщения: 4112
- Зарегистрирован: 05.10.2006 08:52:59
- Откуда: Красноярск
Re: ошибка 201 при работе с дин. масивом
anjeyka » 06.10.2009 13:17:20
Vadim писал(а):Поставьте самой первой строкой программы:
{$mode objfpc}
работает
- anjeyka
- незнакомец
- Сообщения: 6
- Зарегистрирован: 02.10.2009 12:36:44
- Откуда: Киев, Украина
-
- Профиль
- Сайт
- ICQ
Re: ошибка 201 при работе с дин. масивом
Vadim » 06.10.2009 13:26:57
anjeyka
Видимо у Вас в конфигурационном файле (fpc.cfg) стоит режим совместимости с TurboPascal, у которого Integer — это нынешний SmallInt. Проверьте. Найдите в конфигурационном файле опцию -M (можно поискать по контексту). Скорее всего там будет -Mtp. Замените её на -Mobjfpc.
- Vadim
- долгожитель
- Сообщения: 4112
- Зарегистрирован: 05.10.2006 08:52:59
- Откуда: Красноярск
Re: ошибка 201 при работе с дин. масивом
anjeyka » 06.10.2009 13:50:15
Всем учасникам спасибо за обсуждение
Sergei I. Gorelkin и Vadim
отдельная благодарность за новые идеи
- anjeyka
- незнакомец
- Сообщения: 6
- Зарегистрирован: 02.10.2009 12:36:44
- Откуда: Киев, Украина
-
- Профиль
- Сайт
- ICQ
Вернуться в Обучение Free Pascal
Кто сейчас на конференции
Сейчас этот форум просматривают: Google Adsense [Bot] и гости: 2
|
Сообщение |
|
Группа: Пользователи
Репутация: |
Здравствуйте, уважаемые программисты, администраторы, пользователи и т.д. Спойлер (Показать/Скрыть) Сообщение отредактировано: 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
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