2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 Ломается программа Pascal ABC.NET 3.8.2
Сообщение21.05.2022, 22:10 
Что-то странной происходит. Когда я нажимаю запустить, программа завершает свою работу на одном и том же месте, причем сообщения об ошибке не появляется. А когда я выполняю программу пошагово все нормально. Что это может быть?

-- 21.05.2022, 22:13 --

код: [ скачать ] [ спрятать ]
Используется синтаксис Pascal
Uses Unit_Types, Unit_Queue;

function condition(x: TInfo): boolean;
begin
  result := (x mod 3) = 0;
end;

var
  f: Text;
  q: TQueue;
begin

  assign(f, paramstr(1));
  reset(f);

  init(q);

  writeln('Очередь');
  Input(f, q);
  Output(q);
  writeln('Добавление элементов');
  Push(q, 123);
  Push(q, 321);
  Output(q); <---
  writeln('Удаление элементов');
  Pop(q);
  Output(q);
  writeln('Удаление эл-тов кратных 3');
  Delete(q, condition);
  Output(q);
 
end.
 


-- 21.05.2022, 22:14 --

код: [ скачать ] [ спрятать ]
Используется синтаксис Pascal
Unit Unit_Queue;

interface
  Uses Unit_Types;
 
  type
    PEl = ^TEl;
   
    TEl = record
      info: TInfo;
      next: PEl;
    end;
   
    TQueue = record
        first, last: PEl;
    end;
 
  procedure Init(var q: TQueue);
  function IsEmpty(q: TQueue): boolean;
  function Pop(var q: TQueue): TInfo;
  procedure Push(var q: TQueue; a: TInfo);
  procedure Input(f: text; var q: TQueue);
  procedure Output(q: TQueue);
  procedure Delete(var q: TQueue; f: func);
implementation
  procedure Init(var q: TQueue);
  begin
    q.first := nil;
    q.last := nil;
  end;
 
  function IsEmpty(q: TQueue): boolean;
  begin
    result := q.first = nil;
  end;
 
  function Pop(var q: TQueue): TInfo;
  var
    p: PEl;
  begin
    if not isempty(q) then
    begin
      result := q.first^.info;
      p := q.first;
      q.first := q.first^.next;
      dispose(p);
    end;
  end;
 
  procedure Push(var q: TQueue; a: TInfo);
  var
    p: PEl;
  begin
    new(p);
    p^.info := a;
    p^.next := nil;
    if IsEmpty(q) then
      q.first := p
    else
      q.last^.next := p;
    q.last := p;
  end;
 
  procedure Input(f: text; var q: TQueue);
  var
    a: TInfo;
  begin
    while not eof(f) do
    begin
      read(f, a);
      Push(q, a);
    end;
  end;
 
  procedure Output(q: TQueue);
  var
    p: TInfo;
  begin
    while not IsEmpty(q) do
    begin
      p := Pop(q);
      write(p, ' ');
    end;
    writeln();
  end;
 

  procedure Delete(var q: TQueue; f: func);
  var
    q2: TQueue;
    a: TInfo;
  begin
    init(q2);
    while not isempty(q) do
    begin
      a := pop(q);
      if not f(a) then
        Push(q2, a);
    end;
   
    q.first := q2.first;
    q.last := q2.last;
  end;
end.
 

 
 
 
 Re: Ломается программа Pascal ABC.NET 3.8.2
Сообщение22.05.2022, 12:29 
Аватара пользователя
Программа требует передачи ей в параметре имени файла, из которого она считывает параметры, наподобие такого:
Код:
program.exe filename.txt

При этом, если имя файла указано без полного пути, он ищется в текущем каталоге.

1) При пошаговой отладке и при нажатии кнопки "запустить" могут использоваться разные текущие каталоги, в одном из котором нужный файл есть, а в другом — нет. Чтобы проверить этот вариант, нужно указать полный путь к входному файлу:
Код:
program.exe C:\Data\filename.txt
Также убедитесь, что при пошаговой отладке и при нажатии кнопки "запустить" используется один и тот же параметр.
2) Маловероятно, но входной файл может быть открыт в другой программе, которая не даёт его открыть (а при пошаговой отладке вы эту программу не запускаете).
3) Программа на самом деле запускается, находит всё и обрабатывает правильно, но делает это так быстро, что вы не успеваете заметить окно консоли (которое по окончании работы закрывается). Чтобы проверить этот вариант, нужно перед последним "end." добавить "ReadLn;". Программа остановится и не закроется, пока пользователь не нажмёт <Enter>.

Общий принцип отладки без отладчика (если эти три вероятных причины не подтвердятся): нужно сначала убедиться, что программа запускается (из нужного каталога, с нужными параметрами, и т.п.). Потом нужно убедиться, что выполняется первая строчка, для этого в начале нужно поставить отладочный вывод (WriteLn('Контрольная точка 0');), потом убедиться, что после первой строчки управление переходит ко второй (поставить отладочный вывод между первой и второй), и т.д. Так можно локализовать ту строку, после которой программа вылетает.

 
 
 
 Re: Ломается программа Pascal ABC.NET 3.8.2
Сообщение22.05.2022, 12:47 
Сделал как вы сказали. Программа ломается при втором вызове процедуры Output() на dispose(). Мне это ни о чем не говорит.

 
 
 
 Re: Ломается программа Pascal ABC.NET 3.8.2
Сообщение22.05.2022, 15:10 
Похоже проблема в том, что Output вызывает Pop, который вызывает dispose элементов. По сути после вызова Output очередью больше нельзя пользоваться. Нужно изменить Output так, чтобы она не изменяла очередь, а только выводила элементы.

 
 
 [ Сообщений: 4 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group