2014 dxdy logo

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

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




Начать новую тему Ответить на тему
 
 Ломается программа Pascal ABC.NET 3.8.2
Сообщение21.05.2022, 22:10 


24/01/22
61
Что-то странной происходит. Когда я нажимаю запустить, программа завершает свою работу на одном и том же месте, причем сообщения об ошибке не появляется. А когда я выполняю программу пошагово все нормально. Что это может быть?

-- 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 
Заслуженный участник
Аватара пользователя


01/08/06
3049
Уфа
Программа требует передачи ей в параметре имени файла, из которого она считывает параметры, наподобие такого:
Код:
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 


24/01/22
61
Сделал как вы сказали. Программа ломается при втором вызове процедуры Output() на dispose(). Мне это ни о чем не говорит.

 Профиль  
                  
 
 Re: Ломается программа Pascal ABC.NET 3.8.2
Сообщение22.05.2022, 15:10 


27/08/14
206
Похоже проблема в том, что Output вызывает Pop, который вызывает dispose элементов. По сути после вызова Output очередью больше нельзя пользоваться. Нужно изменить Output так, чтобы она не изменяла очередь, а только выводила элементы.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 4 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



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

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


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group