ExitCode = 201

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

ExitCode = 201

Сообщение lev4ik » 12.02.2011 21:35:32

почему выдает exitecode =201??
Код: Выделить всё
PROGRAM Lev;
USES Graph, Crt;
VAR gm, gd, xm, ym, x1m, y1m, i : Integer;
    s : String;
    x, y, x1, y1 : Real;
    label Flag;

FUNCTION F(x : REAL) : REAL;
VAR t : Real;
BEGIN
     F:=x+4-3/x;
END;
BEGIN
     InitGraph(gd,gm,'');
     CLRSCR;

     
     Rectangle(10,10,1260,955);
     Line(10,500,1260,500);
     Line(625,10,625,955);

     
     FOR i:=-12 TO 12 DO
     BEGIN
      Line(625+50*i,490,625+50*i,510);
      IF i<>0 THEN
      BEGIN
        Str(i,s);
        OutTextXY(625+50*i,520,s)
      END
     END;

     
     FOR i:=-9 TO 9 DO
     BEGIN
       Line(615,500+50*i,635,500+50*i);
       IF i<>0 THEN
         BEGIN
           Str(i,s);
           OutTextXY(600,490+50*(-i),s)
         END
     END;

      SetTextStyle(0,0,2);
     OutTextXY(610,505,'O');
     OutTextXY(1245,505,'X');
     OutTextXY(610,13,'Y');

   
     x:=-12;
     WHILE (x>=-12) and (x<=12) DO
       BEGIN
         IF (x+0.1=0) and (x=0) THEN GoTo Flag;
         x:=x+0.1;
         xm:=round(625+x*50);
         ym:=round(500-F(x)*50);

         x1:=x+0.1;
         x1m:=round(625+x1*50);
         y1m:=round(500-F(x1)*50);

         Line(xm,ym,x1m,y1m);

         Flag:
       END;

     READLN;
     CLOSEGRAPH
END.

lev4ik
новенький
 
Сообщения: 12
Зарегистрирован: 31.01.2011 22:31:33

Re: ExitCode = 201

Сообщение Odyssey » 12.02.2011 21:51:42

Судя по документации, это Range check error, т.е. либо выход за пределы массива, либо превышение максимального (минимального) значения типа. Массивов в программе нет, а самый "маленький" тип - Integer, который в режиме по умолчанию эквивалентен SmallInt, т.е. от -32768 до 32767. Нужно найти переменные типа Integer, которые могут становиться больше 32767 и изменить их тип на LongInt.

Либо, как вариант, можно перейти в режим objfpc или delphi (добавить {$mode objfpc} или {$mode delphi} после program). В этих режимах Integer по умолчанию эквивалентен LongInt.
Odyssey
энтузиаст
 
Сообщения: 580
Зарегистрирован: 29.11.2007 17:32:24

Re: ExitCode = 201

Сообщение lev4ik » 12.02.2011 22:01:56

Там не может быть таких чисел по логике даже, это график функции ...
lev4ik
новенький
 
Сообщения: 12
Зарегистрирован: 31.01.2011 22:31:33

Re: ExitCode = 201

Сообщение Maxizar » 12.02.2011 22:17:08

Odyssey +1;
lev4ik - так как вы новичек (это видно по форматированию кода, и особенно по вкл капслоку (лично он меня бесит)). Я переписал программу на лазарус, (консольное приложение).
Общие замечания:
1- FreePascal - (если забыть про ООП и модульность) процедурный язык. Так почему вы пихаете весь код в одну процедуру???
2 - форматирование кода: в лазарусе есть классная комбинация клавишь, которая применяется к выделенному тексту это: ctrl+I и ctrl+u. одна двигает код влево дрыгая вправо на два пробела (это принятая норма почти везде и во всех языках) нужно для отделения логических блоков (хотя бы блока begin end).
3. Вы используете Goto - это зло (если вы не пишите хак, защиту проги или вирус) То это ЗЛО (об этом говорится в любой книге, (если не верите мне лично)). (в моем варианте его нету см код)
Код: Выделить всё
Program project1;

{$mode objfpc}{$H+}

Uses Graph, Crt;

var
    s : String;
    grDriver,grMode : SmallInt;
    ErrCode : Integer;

function F(x : REAL) : REAL;
//VAR t : Real;   //Зачем переменная t если она не используется?
begin
     F:=x+4-3/x;
end;

procedure RunDraw;
var xm, ym, x1m, y1m, i : Integer;
    x,x1:Real;
begin
  Rectangle(10,10,1260,955);
  Line(10,500,1260,500);
  Line(625,10,625,955);


  for i:=-12 to 12 do
    begin
      Line(625+50*i,490,625+50*i,510);
      If i<>0 Then
        begin
          Str(i,s);
          OutTextXY(625+50*i,520,s)
        end
    end;


  for i:=-9 to 9 do
    begin
      Line(615,500+50*i,635,500+50*i);
      If i<>0 Then
        begin
         Str(i,s);
         OutTextXY(600,490+50*(-i),s)
        end
    end;

  SetTextStyle(0,0,2);
  OutTextXY(610,505,'O');
  OutTextXY(1245,505,'X');
  OutTextXY(610,13,'Y');


  x:=-12;

  While (x>=-12) and (x<=12) do
    begin
     If (x+0.1=0) and (x=0) Then Exit;
     x:=x+0.1;
     xm:=round(625+x*50);
     ym:=round(500-F(x)*50);

     x1:=x+0.1;
     x1m:=round(625+x1*50);
     y1m:=round(500-F(x1)*50);

     Line(xm,ym,x1m,y1m);
    end;

end;//procedure RunDraw;

//{$R *.res}

begin //Вход в начало программы (консольная прога)
  grDriver:=Detect;

  InitGraph(grDriver, grMode, '');
  ErrCode:=GraphResult;

  If ErrCode = grOk Then
    Begin
      { Графика }
      RunDraw;

      ReadLn;
      CloseGraph;
    End
  Else WriteLn('Ошибка инициализации графики:', GraphErrorMsg(ErrCode));

end.

Код написан на лазарусе 0.9.29 все компилит и выводи ваш график. исходник во вложении.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Maxizar
постоялец
 
Сообщения: 385
Зарегистрирован: 20.03.2010 19:48:14

Re: ExitCode = 201

Сообщение lev4ik » 12.02.2011 22:23:59

большое спасибо, щас попробую переписать ее на freepascal'e

Что за жесть, полностью копернул твой код к себе и все равно 201 exit code вылазит... :twisted:
lev4ik
новенький
 
Сообщения: 12
Зарегистрирован: 31.01.2011 22:31:33

Re: ExitCode = 201

Сообщение mtdu » 12.02.2011 22:47:24

Не рисуй график ф-и при X стремящемся к нулю.
Всё равно на экране невидно.
Возьми интервал от -12 до -0.5 и от 0.5 до 12.
mtdu
новенький
 
Сообщения: 31
Зарегистрирован: 22.11.2009 13:56:51

Re: ExitCode = 201

Сообщение Odyssey » 12.02.2011 22:58:33

Тогда это может быть из-за деления в функции F.
В отличие от TurboPascal, где используется особое представление значений типа Real, во FreePascal Real не отличается от других типов с плавающей запятой. Поэтому у него есть особенность, присущая таким типам -- из-за погрешности представления точное значение этого числа может чуть-чуть отличаться от того, которое мы ожидаем. Поэтому сравнивать числа с плавающей запятой с помощью обычного "=" не стоит. Так, на очередной итерации x, когда мы ожидаем что он равен 0, он может быть равен 0,00...01, и при делении на это число мы получим довольно большой результат, который не уместится в Integer. Из этой ситуации есть два выхода:
1) Не использовать точное сравнение чисел с плавающей запятой, т.е. вместо
Код: Выделить всё
IF (x+0.1=0) and (x=0) THEN GoTo Flag;

написать что-то типа
Код: Выделить всё
IF (Abs(x+0.1) < 0.001) and (Abs(x) < 0.001) THEN GoTo Flag;

2) Использовать для итерации целые значения, т.е. представлять 0,1 как 1, а 1 как 10. А при вычислении функции производить деление на 10.

P.S.
Про Goto поддержу, лучше обходиться без него. В данном случае для него есть хорошая замена -- Continue, которая переходит в конец текущего цикла.
Последний раз редактировалось Odyssey 13.02.2011 00:50:05, всего редактировалось 2 раз(а).
Odyssey
энтузиаст
 
Сообщения: 580
Зарегистрирован: 29.11.2007 17:32:24

Re: ExitCode = 201

Сообщение Иван Шихалев » 12.02.2011 23:06:04

Odyssey писал(а):В отличие от TurboPascal

Да ну?
Аватара пользователя
Иван Шихалев
энтузиаст
 
Сообщения: 1138
Зарегистрирован: 15.05.2006 11:26:13
Откуда: Екатеринбург

Re: ExitCode = 201

Сообщение Odyssey » 13.02.2011 00:41:17

http://www.freepascal.org/docs-html/pro ... 970008.2.5
Contrary to Turbo Pascal, where the real type had a special internal format, under Free Pascal the real type simply maps to one of the other real types.

Я только переводчик :) Может быть следовало оговориться именно про формат представления? Или документацию нужно поправить?
Odyssey
энтузиаст
 
Сообщения: 580
Зарегистрирован: 29.11.2007 17:32:24

Re: ExitCode = 201

Сообщение Иван Шихалев » 13.02.2011 00:46:28

Это не имеет отношения к плавающей точке. Т.е. в Turbo Real тоже был с плавающей точкой, просто сам по себе специфический — шестибайтный, а во Free Pascal он стал синонимом Double.
Аватара пользователя
Иван Шихалев
энтузиаст
 
Сообщения: 1138
Зарегистрирован: 15.05.2006 11:26:13
Откуда: Екатеринбург

Re: ExitCode = 201

Сообщение Odyssey » 13.02.2011 00:49:18

Ок, поправил сообщение, спасибо.
Odyssey
энтузиаст
 
Сообщения: 580
Зарегистрирован: 29.11.2007 17:32:24

Re: ExitCode = 201

Сообщение Maxizar » 13.02.2011 13:47:41

Далее идет не совсем уравновешенная точка зрения (моя, убогая точка зрения)
    1- Используйте Lazarus.
    2- Забудьте про атавизмы (Goto, Uses Graph, Crt). Не ну правда это даже смешно:
    3- Если этого требует ваш преподаватель, то он не совсем компетентен, не хочет познавать новое. Из – за чего требует вас писать программы на том старом синтаксисе, который он хорошо знает (ему типа так удобнее, а вам втирает мол нужно учится на самом простом) Так если это так: то человек, который так делает, не может называться учителем.
    4- Я переписал программу, и она полностью работает, так в чем проблема?
    5- Если вы настаиваете на своем варианте, ну так, что вам мешает запустить программу по шагам (строчка за строчкой) и узнать где что не так…
    6- Вы думаете, что это никто не делает… Вы ошибаетесь!. Этим занимаются от полных чайников до Профессионалов. Разница лишь в том, что профессионал практически знает в каком именно месте произошла ошибка и знает точно куда ставить брэкпойнт, новичок нет из-за чего приходится проходить весь код… у вас код 100 строк.. и пару циклов….. Дебаггер в руки и вперед.

В защиту использования Lazarus:
В нем вы так же будите писать ваши программки, например вот что выводит мой переписанный вариант:
Изображение

При этом ни каких выкидонов с ошибкой нету, возможно выше отписавшиеся и правы, где то стоит не тот ключик, параметр, директива…Т.е особенность чистого FPC и связки FPC+IDE Lazarus, ну тут нужно более глубокое понимание проблемы и знания особенностей компилятора, таковых не имею. Извините.
Maxizar
постоялец
 
Сообщения: 385
Зарегистрирован: 20.03.2010 19:48:14

Re: ExitCode = 201

Сообщение Vadim » 13.02.2011 14:41:33

Maxizar
А с чего это Crt вдруг стал атавизмом? Я им пользуюсь в консольных приложениях. :)
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: ExitCode = 201

Сообщение Сквозняк » 13.02.2011 19:04:21

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.
Сквозняк
энтузиаст
 
Сообщения: 1126
Зарегистрирован: 29.06.2006 22:08:32


Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5

Рейтинг@Mail.ru