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

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

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 11.05.2013, 13:22   #1
DarkDen
Пользователь
 
Регистрация: 11.05.2013
Сообщений: 38
По умолчанию Как исправить ошибку арифметического переполнения в паскале?

Есть программа необходимая для расчёта вероятности событий.
Код:
program sochets_m;
var
   i, j, n, m, l: integer;
   k1,k2: LongInt;
   a: array[0 .. 100] of integer;
   s, t: string;
   d: set of byte;
 
begin
   write('vvedite N i M: ');
   read(n, m);
   if n<10 then l:=2 else if n<100 then l:=3 else l:=4;
      {form. per. soch.}
   for i:=0 to m do a[i]:=i;
   k1:=0;
   k2:=0;
   repeat
         s:='';
         d:=[];
         for i:=1 to m do begin
            d:=d+[a[i]];
            str(a[i]:l,t);
            s:=s+t
         end;
         if
            (1 in d) and (2 in d) and (3 in d) and (4 in d) or {1}
            (2 in d) and (3 in d) and (4 in d) and (5 in d) or {2}
            (3 in d) and (4 in d) and (5 in d) and (6 in d) or {3}
            (4 in d) and (5 in d) and (6 in d) and (7 in d) or {4}
            (5 in d) and (6 in d) and (7 in d) and (8 in d) or {5}
            (6 in d) and (7 in d) and (8 in d) and (9 in d) or {6}
            (7 in d) and (8 in d) and (9 in d) and (10 in d) or {7}
            (8 in d) and (9 in d) and (10 in d) and (11 in d) or {8}
            (9 in d) and (10 in d) and (11 in d) and (12 in d) or {9}
            (10 in d) and (11 in d) and (12 in d) and (13 in d) or {10}
            (11 in d) and (12 in d) and (13 in d) and (14 in d) or {11}
            (12 in d) and (13 in d) and (14 in d) and (15 in d) or {12}
            (13 in d) and (14 in d) and (15 in d) and (16 in d) or {13}
            (14 in d) and (15 in d) and (16 in d) and (17 in d) or {14}
            (15 in d) and (16 in d) and (17 in d) and (18 in d) or {15}
            (16 in d) and (17 in d) and (18 in d) and (19 in d) or {16}
            (17 in d) and (18 in d) and (19 in d) and (20 in d) or {17}
            (18 in d) and (19 in d) and (20 in d) and (21 in d) or {18}
            (19 in d) and (20 in d) and (21 in d) and (22 in d) or {19}
            (20 in d) and (21 in d) and (22 in d) and (23 in d) or {20}
            (21 in d) and (22 in d) and (23 in d) and (24 in d) or {21}
            (22 in d) and (23 in d) and (24 in d) and (25 in d) or {22}
            (23 in d) and (24 in d) and (25 in d) and (26 in d) or {23}
            (24 in d) and (25 in d) and (26 in d) and (27 in d) or {24}
            (25 in d) and (26 in d) and (27 in d) and (28 in d) or {25}
            (26 in d) and (27 in d) and (28 in d) and (29 in d) or {26}
            (27 in d) and (28 in d) and (29 in d) and (30 in d) or {27}
            (28 in d) and (29 in d) and (30 in d) and (31 in d) or {28}
            (29 in d) and (30 in d) and (31 in d) and (32 in d) or {29}
            (30 in d) and (31 in d) and (32 in d) and (33 in d) or {30}
            (31 in d) and (32 in d) and (33 in d) and (34 in d) or {31}
            (32 in d) and (33 in d) and (34 in d) and (35 in d) or {32}
            (33 in d) and (34 in d) and (35 in d) and (36 in d) or {33}
            (34 in d) and (35 in d) and (36 in d) and (37 in d) or {34}
            (35 in d) and (36 in d) and (37 in d) and (38 in d) or {35}
            (36 in d) and (37 in d) and (38 in d) and (39 in d) or {36}
            (37 in d) and (38 in d) and (39 in d) and (40 in d) or {37}
            (38 in d) and (39 in d) and (40 in d) and (41 in d) or {38}
            (39 in d) and (40 in d) and (41 in d) and (42 in d) or {39}
            (40 in d) and (41 in d) and (42 in d) and (43 in d) or {40}
            (41 in d) and (42 in d) and (43 in d) and (44 in d) or {41}
            (42 in d) and (43 in d) and (44 in d) and (45 in d) or {42}
            (43 in d) and (44 in d) and (45 in d) and (46 in d) or {43}
            (44 in d) and (45 in d) and (46 in d) and (47 in d) or {44}
            (45 in d) and (46 in d) and (47 in d) and (48 in d) or {45}
            (46 in d) and (47 in d) and (48 in d) and (49 in d) or {46}
            (47 in d) and (48 in d) and (49 in d) and (50 in d) or {47}
            (48 in d) and (49 in d) and (50 in d) and (51 in d) or {48}
            (49 in d) and (50 in d) and (51 in d) and (52 in d) or {49}
            (50 in d) and (51 in d) and (52 in d) and (1 in d) or {50}
            (51 in d) and (52 in d) and (1 in d) and (2 in d) or {51}
            (52 in d) and (1 in d) and (2 in d) and (3 in d) {52}
         then begin
            Inc(k2);
            Writeln(k2:10,'     ',s)
         end;
         i:=m;
         while a[i]=n-m+i do dec(i);
         inc(a[i]);
         for j:=i+1 to m do a[j]:=a[j-1]+1;
         Inc(k1);
    until i=0;
    Writeln('Total combinations: ',k1);
    Writeln('X combinations: ',k2);
    end.
Программа останавливается оварийно с ошибкой арифметического переполнения:

C:\fpc\2.6.0\bin\i386-win32\fig41x.exe
Exited with exitcode = 215
Runtime error 215 $ 00402213

Менял integer на byte не помогает.Предлогают использовать ABC, там выдает другую ошибку.
Как исправить ошибку в Free? Огромное спасибо.
DarkDen вне форума Ответить с цитированием
Старый 11.05.2013, 13:29   #2
kta87
Форумчанин
 
Аватар для kta87
 
Регистрация: 22.02.2010
Сообщений: 912
По умолчанию

type Integer = -2147483648..2147483647
type Int64 = -9223372036854775808..92233720368547 75807
Попробуйте заменить тип "Integer" на "Int64"
P.S. если Free Pascal не поддерживает Int64, то используйте вещественный тип extended

Последний раз редактировалось kta87; 11.05.2013 в 13:34.
kta87 вне форума Ответить с цитированием
Старый 11.05.2013, 13:35   #3
DarkDen
Пользователь
 
Регистрация: 11.05.2013
Сообщений: 38
По умолчанию

Спасибо !!! Сейчас попробую.

Компилятор выдает ошибки:
(14,8) error: ordinal expected
(14,21) fatal: internal error 200611054
(0) fatal: comilation aborted
Что делать???
Спасибо

Последний раз редактировалось Stilet; 11.05.2013 в 16:52.
DarkDen вне форума Ответить с цитированием
Старый 11.05.2013, 14:05   #4
kta87
Форумчанин
 
Аватар для kta87
 
Регистрация: 22.02.2010
Сообщений: 912
По умолчанию

У меня к сожалению никогда не было free pascal, я не в курсе некоторых нюансов, но у меня в подписи есть информация по нему. Так что тип "Int64" не поддерживается?
kta87 вне форума Ответить с цитированием
Старый 11.05.2013, 14:31   #5
DarkDen
Пользователь
 
Регистрация: 11.05.2013
Сообщений: 38
По умолчанию

В учебнике нашёл что int64 поддерживается. Но в нэте пишут что есть ограничения использования и именно как у меня в алгаритме ограничение касается циклов. Если ввожу extended такие же ошибки выдает???
DarkDen вне форума Ответить с цитированием
Старый 11.05.2013, 14:35   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
ordinal expected
Потому что Int64 это по факту запись а не целое число.
Цитата:
Что делать???
Проходится отладчиком по программе выясняя на какой строке падает.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 11.05.2013, 14:52   #7
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Код:
d:=d+[a[i]];
Настораживает что d это byte, а - Интеджер.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 11.05.2013, 15:50   #8
DarkDen
Пользователь
 
Регистрация: 11.05.2013
Сообщений: 38
По умолчанию

При типе integer отладчик пошагово проходит полный цикл без ошибок.
При типе extended отладчик сразу при запуске выдает ошибки которые я указал.
При типе int64 отладчик сразу выдаёт ещё больше ошибок???
И что мне теперь со всем этим делать??? Спосибо

P.S. А что делать, приходиться изучать кое-как с нуля самому. Програмка для очень нужного дела нужна. До этого пришлось теорию вероятности изучать самому. Спосибо
DarkDen вне форума Ответить с цитированием
Старый 11.05.2013, 15:55   #9
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,289
По умолчанию

А Вы можете привести условие задачи, а то, может быть, Вы ее не оптимально решаете?
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 11.05.2013, 16:34   #10
DarkDen
Пользователь
 
Регистрация: 11.05.2013
Сообщений: 38
По умолчанию

Я понял. Сори.
Задача - определить вероятность события.
А точнее, имеется 52 ячейки и 52 шара. Из 52 шаров, 13 красные и 39 белые. В ячейки по очереди кладут по одному шару. Определить вероятность того, что радом окажуться 4 красных шара. Частным случаям явлается ситуация когда первые и последние шары могут обьединятся в комбинацию из 4 красных шаров, что является то же событием(этот частный случай учтён в программе).
Тоесть я ввожу константы N=52 M=13. Программа расчитывает все возможные ситуации распределения шаров в ячейках(Total combinations) и ситуации в которых произошло событие(X combinations). Затем я сам делю (X combinations) на (Total combinations) и получаю вероятность события.
Програмку, конечно, почти полностью писал не я а светлые головы. Математики мне помочь не смогли, были даже кандидаты наук. Спасибо
DarkDen вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Исправить ошибку арифметического переполнения в алгоритме. DarkDen Паскаль, Turbo Pascal, PascalABC.NET 2 11.05.2013 13:16
как исправить ошибку? phasha Помощь студентам 0 11.01.2012 21:32
как исправить ошибку? aiktz Паскаль, Turbo Pascal, PascalABC.NET 3 24.09.2009 18:56
прога на Паскале помогите исправить ошибку:( Jeksik Помощь студентам 4 14.10.2008 18:21