Runtime error 201 pascal

Непонятный runtime error 201 при сортировке массива Free Pascal Решение и ответ на вопрос 1400597

1296 / 469 / 151

Регистрация: 24.08.2011

Сообщений: 2,249

1

21.03.2015, 18:48. Показов 5889. Ответов 23


Задание:
1. Разработать процедуры сортировки массива целых чисел методом прямого выбора, методом пузырьковой сортировки и методом шейкерной сортировки (язык программирования Паскаль или Си).
2. Правильность сортировки проверить путем подсчета контрольной суммы и числа серий в массиве.
3. Во время сортировки предусмотреть подсчет количества пересылок и сравнений (М и С), сравнить их с теоретическими оценками.
4. Составить таблицу следующего вида (данные получить экспериментально) для n= 100, 200, 300, 400, 500. (n – количество элементов в массиве)

Я для каждого размера заполняю массив по возрастанию, по убыванию и случайным образом, и замеряю количество пересылок и сравнений для каждого случая. Пока что только метод Прямого выбора проверяю.
При n = 100 все ок. При n = 200 с массивом по возрастанию все ок, по убыванию все ок, а на случайно заполненном массиве вылетает runtime error 201 при попытке обращения к любому элементу (поставила вывод a[0] перед началом, и вывод текущего i на каждой итерации чтобы знать когда оно вылетает, ну и вылетает соответственно при попытке обращения к a[0] перед началом сортировки). Не понимаю в чем вообще может быть дело. Помогите пожалуйста.



0



Модератор

Эксперт по электронике

8279 / 4183 / 1595

Регистрация: 01.02.2015

Сообщений: 13,004

Записей в блоге: 3

21.03.2015, 19:45

2

Лучший ответ Сообщение было отмечено MayaNash как решение

Решение

У меня не сразу воспроизвелась ошибка. И я решил, что это связано с режимами компиляции.
После пошагового тестирования увидел — ошибка при выполнении count_sum. После пошагового выполнения и контроля переменных sum, i стало видно, что при переполнении sum (более ~32000) получается ошибка 201.

Вывод: для суммирования использовать более ёмкий тип.



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



Супер-модератор

Эксперт Pascal/DelphiАвтор FAQ

32451 / 20945 / 8105

Регистрация: 22.10.2011

Сообщений: 36,213

Записей в блоге: 7

21.03.2015, 20:09

6

Лучший ответ Сообщение было отмечено MayaNash как решение

Решение

Керра, гонял во всех режимах совместимости, вылета при 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 и пр. Ошибка не возникала.
Я в растерянности.
————
PS Sorry. Долго набирал. Получилось повторение поста volvo.



0



1296 / 469 / 151

Регистрация: 24.08.2011

Сообщений: 2,249

21.03.2015, 20:17

 [ТС]

8

ФедосеевПавел, тоже только что сделала ту же замену — все еще вылетает при первой сортировке с n = 300
volvo, режим… free pascal 2.6, без модов, в опциях mode debug… чувствую себя совсем студентом…



0



Супер-модератор

Эксперт Pascal/DelphiАвтор FAQ

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 минут
Елки зеленые. Забыла в count_sum поменять тип переменной… Тип функции поменяла, а переменную забыла…

Добавлено через 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

Модератор

Эксперт Pascal/DelphiЭксперт NIX

7502 / 4370 / 2776

Регистрация: 22.11.2013

Сообщений: 12,507

Записей в блоге: 1

22.03.2015, 00:16

15

Лучший ответ Сообщение было отмечено MayaNash как решение

Решение

Керра,
1) обратите внимание на использование в циклах to вместо downto, есть ошибки, когда перебор от большего к меньшему;
2) посмотрите, вероятно предложенный ниже вариант декомпозиции окажется более удачным:

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
type
  TElement=Integer;
 
var
  cntComp, cntSwap: Longint;
 
procedure Swap(var a, b: TElement);
var c: TElement;
begin
  c:=a; a:=b; b:=c;
  Inc(cntSwap);
end;
 
function IsLess(a, b: TElement): Boolean;
begin
  IsLess:=a<b;
  Inc(cntComp);
end;

Тогда код сортировок сохранится незагроможденным (обратите внимание на downto):

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
procedure sort_dsel(var a: array of TElement);
var
  i, j, m: integer;
begin
  for i := 0 to high(a)-1 do begin
    m := i;
    for j := i+1 to high(a) do
      if IsLess(a[j], a[m]) then min := j;
    if m<>i then Swap(a[i], a[m]);
  end;
end;
 
procedure sort_bubl(var a: array of TElement);
var
  i, j: integer;
begin
  for i := high(a)-1 downto 1 do
    for j := 0 to i do
      if IsLess(a[j+1], a[j]) then Swap(a[j], a[j+1]);
end;
 
procedure sort_ctail(var a: array of TElement);
var
  l, r, i: Integer;
begin
  l := 0; r := High(a);
  repeat
    Inc(l);
    for i := r downto l do
      if IsLess(a[i], a[i-1]) then Swap(a[i], a[i-1]);
    Dec(r);
    for i := l to r do
      if IsLess(a[i+1], a[i]) then Swap(a[i+1], a[i]);
  until l>r;
end;

3) В таком варианте и код сбора статистики можно легко унифицировать:

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
type
  TSortProc=procedure (var a: array of TElement);
 
procedure MakeStat;
const
  Sort=array [1..3] of TSortProc = (sort_dsel, sort_bubl, sort_ctail);
  sSort=array [1..3] of String[5] = ('DSEL', 'BUBL', 'CTAIL');
  Fill=array [1..3] of TSortProc = (FillAsc, FillDsc, FillRnd);
  sFill=array [1..3] of String[3] = ('ASC', 'DSC', 'RND');
var
  a: array of TElement;
  i, j, k: Integer;
  s: LongInt;
begin
  for i:=1 to 5 do begin
    SetLength(a, i*100);
    for j:=1 to 3 do 
      for k:=1 to 3 do begin
        Fill[j](a); s:=CountSum(a);
        cntComp:=0; cntSwap:=0; Sort[k](a);
        WriteLn(sSort[k]:6, i*100:4, sFill[j]:8, cntComp:8, cntSwap:8,
          CountAsc(a)=i*100:8, s=CountSum(a):8);
      end;
  end;
  a:=nil;
end;



2



1296 / 469 / 151

Регистрация: 24.08.2011

Сообщений: 2,249

22.03.2015, 07:50

 [ТС]

16

bormant, спасибо



0



bormant

Модератор

Эксперт Pascal/DelphiЭксперт NIX

7502 / 4370 / 2776

Регистрация: 22.11.2013

Сообщений: 12,507

Записей в блоге: 1

22.03.2015, 09:20

17

Если для сравнения алгоритмов захочется получить одни и те же псевдослучайный массивы, это несложно, достаточно обеспечить одинаковое начальное значение ГПСЧ:

Pascal
1
2
3
4
5
6
7
var seed: Cardinal;
...
  Randomize; seed:=RandSeed;
...
  for k:=1 to 3 do begin
    RandSeed:=seed; FillRnd(a);  { одинаковое заполнение для k=1..3 }
    cntComp:=0; cntSwap:=0; Sort[k](a);

Добавлено через 2 минуты
И убрать вызов Randomize из FillRnd().



1



1296 / 469 / 151

Регистрация: 24.08.2011

Сообщений: 2,249

22.03.2015, 09:21

 [ТС]

18

Естественно
Спасибо



0



bormant

Модератор

Эксперт Pascal/DelphiЭксперт NIX

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 — нет. Поэтому возможен такой вариант для подавления ошибки переполнения при подсчете контрольной суммы:

Pascal
1
2
3
4
5
6
7
8
9
{$UNDEF RON}{$IFOPT R+}{$DEFINE RON}{$R-}{$ENDIF}
{$UNDEF QON}{$IFOPT Q+}{$DEFINE QON}{$Q-}{$ENDIF}
function CSum(const a: array of TElement): TElement;
var e: TElement;
begin
  Result:=0; for e in a do Result:=Result+e;
end;
{$IFDEF RON}{$R+}{$ENDIF}
{$IFDEF QON}{$Q+}{$ENDIF}

пляска с условной компиляцией для восстановления лолкальных опций компиляции на последующий код.

Добавлено через 8 минут
или

Pascal
1
2
3
{$PUSH}{$Q-,R-}
...
{$POP}



1



Супер-модератор

Эксперт Pascal/DelphiАвтор FAQ

32451 / 20945 / 8105

Регистрация: 22.10.2011

Сообщений: 36,213

Записей в блоге: 7

22.03.2015, 11:41

20

{$OFFTOP ON}
Вот почему, интересно, FPC не позволяет перегрузить оператор «<» для встроенного типа? Насколько все было бы проще, не надо вводить функцию IsLess, код остается неприкосновенным, только подсчет количества сравнений выполняется в перегруженном операторе… Странно.
{$OFFTOP OFF}



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

Фига се :shock: А я всегда думал, что только один параметр :oops:

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 :wink:

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
Это конец...

:idea: есть идея — проверяю:
у меня 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

IPB

> Pascal. Ошибка в программе. Exitcode = 201., При работе с текстовым файлом

сообщение 27.08.2013 0:32

Сообщение
#1

Группа: Пользователи
Сообщений: 6
Пол: Мужской
Реальное имя: Александр

Репутация: -  0  +



Здравствуйте, уважаемые программисты, администраторы, пользователи и т.д.
Суть программы: меню для игры.
Столкнулся с Exitcod’ом 201. Вылет происходит при использовании цикла чтения из текстового файла и присваивания строк файла массиву.
Что-то я делаю явно не так, вопрос — что?
Собственно, ниже код. Прошу прощения, если форматирование текста кода не является удобночитаемым.
Пишу на Free Pascal, желательно, чтобы программа компилировалась и на Borland Pascal 7.0.
Благодарю за внимание.

Спойлер (Показать/Скрыть)

Сообщение отредактировано: SaheR — 27.08.2013 0:35

 Оффлайн  Профиль  PM 

 К началу страницы 

+ Ответить 

Ромаха

сообщение 28.08.2013 12:47

Сообщение
#2


Новичок
*

Группа: Пользователи
Сообщений: 26
Пол: Мужской
Реальное имя: Роман

Репутация: -  0  +



Добрый день.
Для начала стоит освежить знания о Run-time errors.
А точнее вспомнить что ж за зверь такой 201 и с чем его едят..
201 Range check error
If you compiled your program with range checking on, then you can get this error in the following cases:
An array was accessed with an index outside its declared range.
Trying to assign a value to a variable outside its range (for instance an enumerated type).

То есть выход за пределы.
Начать нужно с того, что или Вы даете нам какой-нить уровень (чтобы не было exitcode = 2). Или Вы пошагово пытаетесь выйти на ошибку..

Удачи! smile.gif

 Оффлайн  Профиль  PM 

 К началу страницы 

+ Ответить 

SaheR

сообщение 28.08.2013 18:52

Сообщение
#3

Группа: Пользователи
Сообщений: 6
Пол: Мужской
Реальное имя: Александр

Репутация: -  0  +



Цитата(Ромаха @ 28.08.2013 11:47) *

Добрый день.
Для начала стоит освежить знания о Run-time errors.
А точнее вспомнить что ж за зверь такой 201 и с чем его едят..
201 Range check error
If you compiled your program with range checking on, then you can get this error in the following cases:
An array was accessed with an index outside its declared range.
Trying to assign a value to a variable outside its range (for instance an enumerated type).

То есть выход за пределы.
Начать нужно с того, что или Вы даете нам какой-нить уровень (чтобы не было exitcode = 2). Или Вы пошагово пытаетесь выйти на ошибку..

Удачи! smile.gif

Спасибо за напоминание, но я написал сюда уже от беспомощности т.к. и не нашёл, где происходит выход за пределы массива.
Файл level.txt должен содержать просто названия уровней, которые уже в будущем будут загружаться из одноимённых файлов.
Собственно, из-за

gotoxy(7, i*2);

в этом файле должно быть не более 12 строк. На данный момент, у меня в этом файле находится всего четыре строчки, в каждой по одному слову(если нужно, уточню — в английской раскладке).
Когда впервые с этой ошибкою встретился в данном коде, то даже массив arrlevels сделал с индексами от 1 до 150.
Благодарю за пожелание удачи :3

 Оффлайн  Профиль  PM 

 К началу страницы 

+ Ответить 

SaheR

сообщение 28.08.2013 19:19

Сообщение
#4

Группа: Пользователи
Сообщений: 6
Пол: Мужской
Реальное имя: Александр

Репутация: -  0  +



Всё, ошибку свою нашёл. Вместо readln, при чтении с файла, использовал read.

 Оффлайн  Профиль  PM 

 К началу страницы 

+ Ответить 

1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)

Пользователей: 0

500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают

Связь с администрацией: 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

Понравилась статья? Поделить с друзьями:

Читайте также:

  • Runtime error 200 at pascal
  • Runtime error 19 file or function is not found samp
  • Runtime error 1722 сервер rpc недоступен
  • Runtime error 13 type mismatch excel как исправить
  • Runtime error 13 access type mismatch

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии